我有两个关于数据库设计的选择。
修改
它用于存储项目的值
值可以是:INTEGER或DOUBLE或TEXT或VARCHAR ...
结束修改
我的问题是:他们之间有什么优点/缺点?在我想要存储动态表单值的上下文中,例如Google Form(docs.google.com)。
Table: value
Column: item_id value_int value_varchar value_text value_double
Datatype: INTEGER INTEGER VARCHAR(255) TEXT DOUBLE
Table: value_int
Column: item_id value
Datatype: INTEGER INTEGER
Table: value_varchar
Column: item_id value
Datatype: INTEGER VARCHAR(255)
Table: value_text
Column: item_id value
Datatype: INTEGER TEXT
Table: value_double
Column: item_id value
Datatype: INTEGER DOUBLE
答案 0 :(得分:2)
第二种选择并非真正的选择。它是什么,是一个可怕的错误。你为什么要这样做?对于第二种情况,我没有一个可以想到的优势。如果您希望,例如一次获得多个值,在第一种情况下,您只需选择一行(或其子集)。在第二种情况下,你将执行不必要的JOINS,甚至更糟糕的是,多次查询(好吧,我接受,我真的不知道哪个会更糟,但两者都是难以言喻的坏)。在第二种情况下,您不必要地使系统设计复杂化。
您是否尝试存储类似一般值的内容,即可能是double或float等值,如变体?在这种情况下,最好为double,int等制作不同的表,并在每行中存储相应表的类型和id。这是我仍然不建议的,并且只是要求您使用第一个选项,但是如果您担心存储要求,则可能需要这样做。
与第一种选择相比,第二种选择绝对没有任何优势,而是表明设计不良。
修改强>
这里有两种选择。与第一个一起使用,或者,您可以创建名为'double','int','string'等的表。在主表中,只有3列,'value_name','value_type','value_id'。如果我要说,x = 3.1
,那么将3.1放在表'双打'中。假设表格如下:
table `doubles`
id value
1 3.1
此ID应仅依赖于表'double'而不是其他。在主表中,条目应为:
table `main`
value_name value_type value_id
x double 1
value_type
和value_id
应该指出您正确的值。此表的问题在于您需要至少2个查询才能获取值。因此,如果存储不是一个非常大的问题,您可以很好地使用您的第一个选项,其中可以在单个查询中接收数据。
您还可以做的是以原始格式存储数据(直接写入字节),但它会根据体系结构创建平台,但大多数情况下它会完全禁止您使用条件子句,索引等。所以,我绝对不会推荐这种方法。
在我告诉你的第二个选项中,你只存储了所需数量的双打,整数和字符串。在第一个选项中,我们存储所有附加的便利,我们可以立即获取数据,无需多次查询或昂贵的JOIN。在您的第二个选项中,既不存在存储权衡,也不能在没有多个查询或昂贵的JOIN的情况下获取数据。
答案 1 :(得分:1)
如果没有上下文,我会说选项1更好,因为我推断您希望给定项目中的每一项都有一个值。
如果没有,那么我相信你正在进入第四个规范化形式,它表示你应该将它们提取到单独的表中。然而在实践中,大多数人并没有达到正常水平。 http://en.wikipedia.org/wiki/Fourth_normal_form
答案 2 :(得分:0)
您可能需要查看database normalization。
第一个选项不能坏,因为我们不知道里面的数据是什么。第二个选项,我不认为为每个数据创建一个表并将其与id配对是个好主意。您可以拥有一个包含数据类型的表和一个将id链接到通用数据(如地名,公司名称等)的表。
因编辑而修改
因此,如果它只是您想要的项目表,我会使用选项1,因为选项2复制了多次ID。选项2还会在表之间添加许多无用的链接。