当值可以是几种不同类型时,如何管理键值对存储?

时间:2012-08-22 13:16:53

标签: mysql database database-design data-modeling

假设我有n个属性(对键值),它们是日期,数字或字符串。哪种数据模型最有效存储它们?

这是我想到的解决方案:

Data model

data表的每一行都必须能够链接到多种类型的 n 属性。

此解决方案的优点是,如果我想添加新类型,我只需要添加两个新表(label_xyvalue_xy),而不是修改现有表的结构。但这个解决方案真的是最方便的吗?

你会怎么做?

感谢:)

2 个答案:

答案 0 :(得分:3)

我已经使用了所有场景:

  1. 您描述的那个(自己表中的每种数据类型)
  2. 来自Anthony的回答 - 只有值的字符串才能按需转换为ither数据类型
  3. 一个包含多个具有不同数据类型的列的表,其中每个记录中只使用一个(其余的是稀疏列)
  4. 从这些解决方案:1。加入地狱,2。如果你的数据主要是字符串,那就好了.3。虽然有点空间消耗是迄今为止最好和最有效的。

    至于3.我必须解释一下,表格如下:

    EntityID int,
    TypeID int,
    LabelID int,
    ValueInt int,
    ValueDecimal decimal(12,4),
    ValueString nvarchar(max),
    ValueDate datetime
    

    (虽然LabelID已定义为TypeID,但我将其用于无连接使用目的。)

答案 1 :(得分:1)

这实际上取决于数据的性质。如果您有数百万的值并且需要强类型,那么这可能是一种方法。但是,正如您所提到的,每种新数据类型都需要新表。

如果实际上你只有几千个名称值对,并且数据的RANGE是相当规则的,即数字是整数,日期是10个字符,字符串小于200个字符你可以定义所有这些一张表即:

id int,
name varchar(50),
输入int,
value varchar(200)
指数(名称)

id不是必需的,但设计很好。
命名约定取决于您,如果需要可以应用唯一约束 类型可以是1 = int,2 = date,3 = string(其他可以在以后轻松添加)
可以根据您的最大字符串定义该值。

这个解决方案有利于简化而不是性能,但这将由需求决定,字符串数据类型将是您的外卡,将它定义为“文本”可能更有意义。