2013-07-14 31 views
1

我有一个源(网页),它具有我需要存储在一个表中的公用数据和罕见数据。按不同的列创建表插入

的数据可以是这样的:

model: xyz, attr_1: xyz, attr_2: xyz 
model: xyz, attr_3: xyz, attr_4: xyz 
model: xyz, attr_1: xyz, attr_4: xyz 
model: xyz, attr_1: xyz, attr_5: xyz 
model: xyz, attr_15: xyz, attr_20: xyz 

这个数据就会产生此DML:

insert into table (model, attr_1, attr_2)values('xyz','xyz','xyz'); 
insert into table (model, attr_3, attr_4)values('xyz','xyz','xyz'); 
insert into table (model, attr_1, attr_4)values('xyz','xyz','xyz'); 
insert into table (model, attr_1, attr_5)values('xyz','xyz','xyz'); 
insert into table (model, attr_15, attr_20)values('xyz','xyz','xyz'); 

我的问题是,INSERT命令,所以我可以在我无法定义表不知道列和每一个新的插入我可能会发现新的列。在实际插入之前,我无法获得所有插入命令。我唯一想到的是将每一行插入到不同的表中(使用create table as insert into),然后使用UNION ALL来创建最终表。但这听起来不太好主意。

编辑我不寻找规范化的表。

最终的结果应该是(作为例子):

table_name 
id  int 
model varchar 
attr_1 varchar 
attr_2 varchar 
attr_3 varchar 
attr_4 varchar 
attr_5 varchar 
attr_15 varchar 
attr_20 varchar 
+0

就像你不能吃你的蛋糕,仍然有它,你不能让简单和不规范它。 – mvp

回答

1

有一个非常简单的解决这个。你需要改变你的表:

table: model 
modelName attribute value 
xyz  1   xyz 
xyz  2   xyz 

然后当你做INSERT,你会怎么做:

INSERT INTO `model` (`modelName`, `attribute`, `value`) VALUES ('xyz', 1, 'xyz') 

这是一个标准化的表结构,允许n量的属性。

0

如果您使用阵列来获取数据,那么您可以使用PHP的implode(', ', $array)。但是,您可能没有使用PHP。如果是这种情况,你总是可以连接。

0

正确的解决方案是规范你的模式。

创建2个表:主模型的主表 - 几乎你现在拥有的,但没有属性,并且从表保留属性。类似这样的:

CREATE TABLE master (
    master_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    model VARCHAR(50) 
); 

CREATE TABLE attrs (
    attr_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    master_id INTEGER NOT NULL, 
    attr_name VARCHAR(20) 
); 

该模式相当紧凑并且具有一些重要的属性。例如,它允许您保留与给定模型关联的任意数量的属性 - 可以是0,也可以是1000.

要插入数据,您需要先插入主表中,然后再插入attrs表。

检索数据,使用简单的加盟这样的:

SELECT m.model, 
     a.attr_name 
FROM master m 
JOIN attrs a ON m.model_id = a.model_id 
WHERE ... 
相关问题