0

要求:一组包含要插入到 db 中的十进制数字的数据。该集合中的值的总数可以从 12 到 288 不等。这些数据仅用于计算,这些数据将根据其他列中的其他参数获取,例如:日期

解决方案:是否应该动态创建列以插入每个值,或者我们可以使用一列以逗号分隔格式包含这些值?

请提出有效的方法。

4

1 回答 1

0

是否应该动态创建列以插入每个值,或者我们可以使用一个以逗号分隔格式包含这些值的列?

取决于从数据库管理的角度来看,一组值是否可以被认为是“原子的”。

  • 如果(所有值始终作为一个单元一起从数据库读取和写入数据库),那么您可以继续将它们编码到一个字段中。逗号分隔的列表是一种可能的编码方式,但使用“特殊”数据类型(如 Oracle 的 RAW 或 PostgreSQL 数组)可能会更好。
  • 如果不是(这些值确实需要单独访问),请考虑可能值的数量与预期在给定集合中使用的数量。如果前一个数字相对较小,并且您可以动态构建查询以容纳新列,并且在未使用的列中存储 NULL 的成本是可以接受的,那么您可以考虑动态添加列。

但是还有另一种选择......如果数据是“稀疏的”并且有大量适用的值,但只有一小部分适用于给定的集合,那么使用EAV的形式可能更合适......

创建两个表,一个用于“集合”,另一个用于“集合中的值”,并通过 1:N 关系连接它们。例如:

CREATE TABLE SET (
    SET_ID INT PRIMARY KEY
    -- Other fields...
);

CREATE TABLE SET_VALUE (
    SET_ID INT REFERENCES SET (SET_ID),
    NAME VARCHAR(50),
    VALUE DECIMAL,
    PRIMARY KEY (SET_ID, NAME)
);

这样,您不需要动态添加新列,但仍保留访问单个值的能力(与逗号分隔的列表不同)。

于 2013-06-19T09:56:42.470 回答