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');

我的问题是我无法在插入命令之前定义表,所以我不知道列,并且在每个新插入中我可能会发现新列。在实际插入之前,我无法获得所有插入命令。我唯一想到的是将每一行插入不同的表(使用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
4

3 回答 3

1

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

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

然后,当您执行 时INSERT,您将执行以下操作:

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

这是一个规范化的表结构,允许n大量的属性。

于 2013-07-14T21:27:54.453 回答
0

如果您使用数组来获取数据,那么您可以使用 PHP 的implode(', ', $array). 但是,您可能没有使用 PHP。如果是这种情况,您总是可以将您正在使用的内容连接INSERT起来,

于 2013-07-14T21:28:08.800 回答
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 ...
于 2013-07-14T21:28:17.533 回答