Add Relation Product From a table

Here is the table content:

id	skus
1	P763B,P763A,P739A,P574P,P574C,P574B,P573K
2	P573G,P0870,P0860,D9543,D8984
3	D8983,D8821,D8579,D8573,D853A,D8539
4	D824A,D7805

 Add each sku with its relation product skus(in one line) into magento

<?php
/**
 * 导入关联商品
 * @author bysoft
 *
 */
class Bysoft_Import_Model_Relationproduct extends Mage_Core_Model_Abstract
{
	protected $_write;
	protected $_read;
	
    protected function _construct(){

       $this->_init("import/relationproduct");
       $this->_read = Mage::getSingleton('core/resource')->getConnection('core_read');
       $this->_write = Mage::getSingleton('core/resource')->getConnection('core_write');

    }
    
    public function run() {
    	//Follow four should run only no data in temp tables.
    	$this->truncate_table();//clean product data table;
    	$this->import_data_from_csv_to_db();//get product data from csv file
    	$this->add_relation_products();
    }
    
    public function truncate_table() {
    	$sql = "truncate table bysoft_import_relation_product";
    	$this->_write->query($sql);
    }
    
    public function import_data_from_csv_to_db() {
    	$file_path = BP . DS . 'media' . DS . 'import' . DS . 'relation_product.csv';
    	$file = fopen($file_path,'r');
    	$i = 0;
    	while ($data = fgetcsv($file)) {
    		++$i;
    		if ($i != 1) {
    			$model = Mage::getModel('import/relationproduct');
    			$skus = str_replace(' ','',$data[0]);
    			$skus = str_replace(',',',',$skus);
    			$model->setData('skus',$skus);
    			$model->save();
    			var_dump($data[0]  . ' save into db.');
    		}
    	}
    }
    
    public function add_relation_products() {
    	$sql = "select skus from bysoft_import_relation_product order by id";
    	$results = $this->_read->fetchAll($sql);
    	foreach ($results as $row) {
    		$skus = trim($row['skus']);
    		$sku_arr = explode(',', $skus);
    		//处理一行SKU
    		foreach ($sku_arr as $key=>$val) {
    			if (trim($val) == '') {
    				unset($sku_arr[$key]);
    			}
    		}
    		foreach ($sku_arr as $key=>$sku) {
    			$self = $sku;
    			$_product = Mage::getModel('catalog/product')->loadByAttribute('sku', $self);
    			$_product = Mage::getModel('catalog/product')->load($_product->getId());
    			$rel_data = array();
    			foreach ($sku_arr as $key_rel=>$rel_sku) {
    				if ($key_rel != $key) {
    					$rel_product = Mage::getModel('catalog/product')->loadByAttribute('sku', $rel_sku);
    					$rel_data[$rel_product->getId()] = array('position'=>$key_rel);
    				}
    			}
    			$_product->setRelatedLinkData($rel_data);
    			$_product->save();
    			var_dump('Product : ' . $_product->getSku());
    			var_dump($rel_data);
    		}
    	}
    }
    
    

}
	 

 

<think>我们之前解决了pg_hba.conf的访问问题,现在用户提到在解决该错误后出现了与维度(dimension)相关的问题。由于用户没有提供具体错误信息,我们需要从数据库维度设计的常见问题入手。 可能的维度问题场景: 1. 数据库表结构设计问题:例如事实表与维度表的关系、维度表的主键设计等。 2. 查询语句问题:在连接维度表时出现错误(如连接条件错误、重复数据等)。 3. 数据加载问题:ETL过程中维度数据加载异常(如缓慢变化维处理不当)。 4. 数据库配置问题:虽然pg_hba.conf解决了连接问题,但可能其他配置(如work_mem等)影响了维度查询性能。 由于信息有限,我们将分步骤排查: ### 一、检查数据库表结构 1. **确认维度表主键** ```sql -- 检查维度表是否有主键 SELECT a.attname, format_type(a.atttypid, a.atttypmod) AS data_type FROM pg_index i JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = 'dimension_table_name'::regclass AND i.indisprimary; ``` 如果没有主键,需要添加: ```sql ALTER TABLE dimension_table_name ADD PRIMARY KEY (dim_id); ``` 2. **检查外键关系**(如果使用了外键) ```sql -- 查看事实表的外键约束 SELECT conname, conrelid::regclass, confrelid::regclass, pg_get_constraintdef(oid) FROM pg_constraint WHERE confrelid = 'dimension_table_name'::regclass; ``` ### 二、检查查询语句 常见问题:连接维度表时出现笛卡尔积(缺少连接条件)、使用错误的连接类型等。 示例问题查询: ```sql -- 错误:缺少连接条件(将导致笛卡尔积) SELECT * FROM fact_table, dimension_table; -- 正确:应指定连接条件 SELECT * FROM fact_table JOIN dimension_table ON fact_table.dim_id = dimension_table.id; ``` ### 三、检查数据质量 1. **重复维度数据** ```sql -- 检查维度表是否有重复的代理键 SELECT dim_key, COUNT(*) FROM dimension_table GROUP BY dim_key HAVING COUNT(*) > 1; ``` 2. **缓慢变化维(SCD)处理异常** - 如果使用类型2(历史记录),检查当前记录标志是否更新正确: ```sql -- 查找同一业务键有多条当前记录的情况 SELECT business_key FROM dimension_table WHERE current_flag = true GROUP BY business_key HAVING COUNT(*) > 1; ``` ### 四、性能问题 如果维度表很大,查询性能可能下降。考虑以下优化: 1. **为连接字段创建索引** ```sql CREATE INDEX ON dimension_table (id); -- 假设id是连接字段 ``` 2. **调整数据库配置** ```sql -- 临时增加work_mem(仅对当前会话有效) SET work_mem = '64MB'; -- 永久修改(需重启或重新加载) -- 修改postgresql.conf: work_mem = 64MB ``` ### 五、其他可能问题 - **数据类型不匹配**:事实表中的外键字段与维度表的主键字段数据类型不一致。 ```sql -- 检查字段类型 SELECT f.attname AS fact_column, f.atttypid::regtype AS fact_type, d.attname AS dim_column, d.atttypid::regtype AS dim_type FROM pg_attribute f JOIN pg_attribute d ON f.attname = 'dim_id' AND d.attname = 'id' WHERE f.attrelid = 'fact_table'::regclass AND d.attrelid = 'dimension_table'::regclass; ``` 如果不一致,需修改: ```sql ALTER TABLE fact_table ALTER COLUMN dim_id TYPE integer; -- 示例 ``` > **注意**:以上步骤需要替换`dimension_table_name`、`fact_table`等为实际表名。 §§相关问题§§ 1. PostgreSQL中如何创建索引以优化维度表查询性能? 2. 如何处理缓慢变化维(SCD)类型2? 3. 如何检测并解决数据库中的重复数据问题? 4. PostgreSQL中如何修改表字段的数据类型?</think>根据您描述的"dimension issue after resolving FATAL no pg_hba.conf entry for host",结合数据库连接问题解决后可能出现的维度相关问题,我将从数据库设计、查询优化和配置调整三个方面提供解决方案: ### 一、维度表结构设计问题 1. **检查维度表主键约束** 确保维度表有唯一主键,避免事实表关联时产生笛卡尔积: ```sql -- 检查维度表主键 SELECT a.attname, format_type(a.atttypid, a.atttypmod) AS data_type FROM pg_index i JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = 'dimension_table'::regclass AND i.indisprimary; -- 若无主键则添加 ALTER TABLE dimension_table ADD PRIMARY KEY (dim_id); ``` 2. **验证数据类型一致性** 事实表外键字段必须与维度表主键类型完全匹配: ```sql -- 比较字段类型 SELECT f.attname AS fact_column, f.atttypid::regtype AS fact_type, d.attname AS dim_column, d.atttypid::regtype AS dim_type FROM pg_attribute f JOIN pg_attribute d ON f.attname = 'dim_id' AND d.attname = 'dim_id' WHERE f.attrelid = 'fact_table'::regclass AND d.attrelid = 'dimension_table'::regclass; ``` ### 二、维度查询性能优化 1. **创建维度表索引** 对高频过滤字段创建部分索引: ```sql CREATE INDEX idx_dim_active ON dimension_table (dim_id) WHERE is_active = true; ``` 2. **优化星型查询** 使用CTE预先过滤维度: ```sql WITH filtered_dims AS ( SELECT dim_id FROM dimension_table WHERE category = 'Electronics' ) SELECT f.sales, d.dim_name FROM fact_table f JOIN filtered_dims d ON f.dim_id = d.dim_id; ``` 3. **调整内存配置** 修改`postgresql.conf`提升维度处理性能: ```conf work_mem = 64MB # 每个查询操作的内存 maintenance_work_mem = 1GB # VACUUM等维护操作的内存 effective_cache_size = 4GB # 预计的OS缓存大小 ``` ### 三、维度数据加载问题 1. **缓慢变化维(SCD)处理** 使用MERGE语句处理类型2缓慢变化维: ```sql MERGE INTO dimension_table AS target USING (VALUES ('prod123', 'New Product', current_date)) AS source (prod_id, prod_name, eff_date) ON target.prod_id = source.prod_id WHEN MATCHED AND target.prod_name <> source.prod_name THEN UPDATE SET is_current = false, end_date = current_date WHEN NOT MATCHED THEN INSERT (prod_id, prod_name, start_date, is_current) VALUES (source.prod_id, source.prod_name, source.eff_date, true); ``` 2. **批量加载优化** 使用COPY命令加速维度数据加载: ```sql COPY dimension_table FROM '/path/to/dim_data.csv' WITH (FORMAT csv, HEADER, DELIMITER '|'); ``` ### 四、维度元数据检查 ```sql -- 检查维度表统计信息 ANALYZE dimension_table; -- 查看维度表大小及索引使用 SELECT relname, pg_size_pretty(pg_total_relation_size(oid)), idx_scan AS index_scans FROM pg_stat_user_tables WHERE relname = 'dimension_table'; ``` > **关键建议**: > 1. 维度表应包含代理键(Surrogate Key)和自然键(Natural Key)[^2] > 2. 大型维度表使用列式存储:`ALTER TABLE ... SET (columnar = true)` > 3. 定期重建索引:`REINDEX TABLE dimension_table;`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值