0

要求:一组数据,其中包含要在db中插入的十进制数字。日期用于动态更改列的逗号分隔值替代?

解决方案::应的列被动态地创建,以在该设定值的总数量可以从12到288。 使用只是为了计算这些数据,将基于在其他列的其它参数,如取出变化插入每个值 或 我们可以使用一列将以逗号分隔的格式具有这些值吗?

请提出有效的方法。

回答

0

应该动态创建列以插入每个值或我们可以使用一列将以逗号分隔的格式具有这些值?

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

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

但还有另一种选择......如果数据是“稀疏”,并有大量的应用价值,但只有一小部分将适用于一个给定的,然后使用表单EAV可能更合适...

创建两个表,一个用于“set”,另一个用于“value in set”,并通过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) 
); 

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

+0

对于给定的标准(如日期),整个值总是作为一组读取。我们可以在postgresql数组中存储任何类型的值(float,integer)。如果存储在数组中,我们如何获得java中的单个值。 – Dinuhere

+0

在需求变化之前需要多长时间,以便您现在想要检索一些(但不是所有)基于其他标准的值?如果发生这种情况,如果将它们存储为集合是原子值,则必须进行重大改写。 –

+0

@ user1709958 _“我们可以在postgresql数组中存储任何类型的值(float,integer)。”_ - 是的,只要不将它们混合在同一个数组中(但考虑[this](http:/ /merlinmoncure.blogspot.com/2007/09/this-will-be-first-in-what-hopefully-be.html))。 _“如果存储在数组中,我们如何获得java中的单个值。”_ - 我不知道,我确定你的JDBC驱动程序记录了这个主题,并且可能有SO帖子。 –