使用一个表或分离多个表有什么优点和缺点?

时间:2012-02-24 02:59:06

标签: sql database database-design

我有两个关于数据库设计的选择。

修改
它用于存储项目的值 值可以是:INTEGER或DOUBLE或TEXT或VARCHAR ...
结束修改

我的问题是:他们之间有什么优点/缺点?在我想要存储动态表单值的上下文中,例如Google Form(docs.google.com)。

选项1:

Table: value
Column:     item_id     value_int       value_varchar       value_text      value_double
Datatype:   INTEGER     INTEGER         VARCHAR(255)        TEXT            DOUBLE

选项2:

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

3 个答案:

答案 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_typevalue_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还会在表之间添加许多无用的链接。