我需要设计一个数据库来存储键值数据。键名列表不是固定的,应该在以后扩展。我不想为每个键创建一个列,因为我需要频繁地添加列,而且它可能会变得太大,而且我知道实体属性值设计是没有效率的。我想到了以下类型的表格设计,我在问它是否有意义,有没有人能想出任何与效率、桌子大小或其他问题有关的缺点-
表中的每个列都是不同的数据类型;与键无关的列为NULL:
ID |DataType |KeyName |ValInt |ValSmallInt|ValBool |ValStr |ValText |ValDate
-------------------------------------------------------------------------------
1 |1 (int) |Width |100 |NULL |NULL | NULL | NULL | NULL
2 |1 (int) |Height |200 |NULL |NULL | NULL | NULL | NULL
3 |2 (bool) |IsActive|NULL |NULL |false | NULL | NULL | NULL
4 |3 (text) |URL |NULL |NULL |NULL | NULL | w.com | NULL
5 |1 (int) |Size |4 |NULL |NULL | NULL | NULL | NULL
6 |4 (date) |Created |NULL |NULL |NULL | NULL | NULL | 2/2/2012
列数将作为所有数据类型的数量(大约30?)。
DataType列是int类型的标志,用于调用方-它告诉调用者从哪个列获取值。
每一行实际上都是另一个表中某个对象的属性。一组行为该对象生成一组属性,通常情况下,SELECT将得到整个集合。
发布于 2013-07-05 08:41:41
正确的说法是,将不同的键表示为表中的列是个坏主意。正确的做法是将它们表示为不同的行。
这就留下了统一存储不同类型值的问题。备选方案如下
(a)将它们存储在不同的表中,代价是必须执行不同的查询来查找不同类型的值,并且必须使用JOIN
检索所有值。根据您的使用模式,这可能是一个好主意。例如,如果您通常查找单个值而不是整个集合,并且调用方知道每个键代表什么类型,那么这就是更好的解决方案。
(b)将它们全部储存在同一表中,而代价是必须对价值栏的类型使用最不常见的分母。这意味着每次检索值时都必须转换或转换该值,并且可能还必须在每个记录中存储一个类型标志。在面向对象的编程语言中,这将是一个可怕的想法,因为他们有更好的多态集合选项,但是如果您想要高效的检索,或者调用方不一定知道每个键的类型,那么它可以是数据库模式的最佳解决方案。
请注意,对于相同的数据,您的解决方案需要更多的列,并且还要求调用方知道要检索哪种类型(或者检查所有可选字段,以确定哪个字段不是NULL
)。因此,我将选择(a)或(b),这取决于您典型的使用模式。
https://softwareengineering.stackexchange.com/questions/203798
复制相似问题