【问题标题】:How to manage key-value pairs storage when the value can be of several different types?当值可以是多种不同类型时,如何管理键值对存储?
【发布时间】:2012-08-17 22:21:39
【问题描述】:

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

这是我想到的一个解决方案:

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

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

你是怎么做到的?

谢谢:)

【问题讨论】:

    标签: mysql database database-design data-modeling


    【解决方案1】:

    我已经使用了所有场景:

    1. 您描述的那个(每个数据类型都在自己的表中)
    2. 来自 Anthony 的回答 - 仅值字符串按需转换为其他数据类型
    3. 一个表有多个不同数据类型的列,其中每条记录只使用一个(其余为稀疏列)

    从这些解决方案中:1. 加入地狱,2. 如果您的数据主要是字符串,这很好,3. 虽然有点过度消耗空间是迄今为止最好和最有效的。

    至于3。我必须解释一下,表格是这样的:

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

    (尽管LabelID 定义了TypeID 我都将它们用于无连接用途。)

    【讨论】:

    • 这个解决方案很有趣,但问题是数据库应该具有相当的可扩展性,这样添加另一种类型就不会那么麻烦了。在这种情况下,我必须通过为新类型添加一个新列来更改表的结构,对吗?
    • 是的,您会考虑,但是您甚至可以考虑多少新类型?他们没有那么多。并且您始终可以使用大范围类型(​​即 int)来覆盖小范围类型(​​即 tinyint)。
    • 你是对的。我只需要选择一个足够详尽的类型列表。还是谢谢!
    • 请考虑,与经典的规范化模式相比,这种解决方案可能永远不会足够有效。 IE。在该表上定义好的索引并不容易。
    • 不,我的意思是这三个动态列解决方案都不是。 :]
    【解决方案2】:

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

    如果实际上您只有几千个名称值对,并且数据的范围相当规则,即数字是整数,日期是 10 个字符,字符串少于 200 个字符,那么您可以在一张桌子,即:

    id 整数,
    名称 varchar(50),
    输入整数,
    值 varchar(200)
    索引(名称)

    id 不是必需的,但设计不错。
    命名约定由您决定,如有必要,可以应用唯一约束。
    类型可以是 1=int, 2=date, 3=string(其他可以很容易地在以后添加)
    该值可以根据您的最大字符串进行定义。

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

    【讨论】:

    • 那么,你将pair的值存储为字符串序列化的形式,并在使用时将其转换为原始类型,不是吗?
    • 是的,因为我假设您知道所需的类型,并将对数据库的调用包装为 int maxSessions=NameValuePairs.getInt("WP_maxSessions")String defaultGreeting=NameValuePairs.getString("WP_defaultGreeting") 如前所述,这是一个非常简单的实现,并且虽然它确实需要强制转换,但它可以很容易地适应新的数据类型,例如getIPAddress
    猜你喜欢
    • 2017-04-20
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多