哪种表架构更好?

时间:2011-11-10 23:49:36

标签: mysql database-design schema

哪种结构更好?

表1

postid category1 category2 category3
2            a         b        d

3            a         c       null

发表表格

postid
2
3

category_option表

category     option

category1      a
category2      b
category3      c
category4      d

option_post表

post option
2      a
2      b
2      d 
3      a
3      c

似乎第一个结构的建立查询比第二个结构更容易。

6 个答案:

答案 0 :(得分:3)

这两种结构模拟了不同的东西。第一个严格地仅允许(最多)3个类别(并按位置区分类别),而第二个类别可以模拟任意数量的类别(不按位置区分)。哪一个更好取决于你想要完成什么...

在纯技术级别上,第二个可能需要JOIN来进行某些查询,其中第一个查询可以满足来自单个(且唯一)表的查询。这是否是一个问题,再取决于具体情况......

答案 1 :(得分:2)

第二个更好。这是典型的很多2连接表案例。

如果以第一种方式进行,如果有新的类别类别4,5,6,7,8,你会怎么做?来?在表中添加新列?

而且,我不知道你是否有这样的要求,“有多少个帖子有类别选项'c'”? 第二个很容易做统计,但第一个......

答案 2 :(得分:2)

取决于要求......

您是否预计会随着时间的推移增加选项数量?

您的第一个选项是更容易编码,第二个选项更加模块化设计和可扩展。

答案 3 :(得分:2)

这在很大程度上取决于类别的性质。如果列表是固定的并且不太可能增长,那么第一个结构工作得很好并且可以更容易使用。如果类别列表可能会增长,那么第二个选项将会更好。

如果类别值稀疏也很重要。如果大多数类别没有值,那么第二种方法将占用更少的空间。如果每个项目的每个类别都有值,那么这不是问题。

在这种情况下,了解“可能”的含义非常重要。这并不意味着设计师不认为它会增长。这意味着类别列表已被充分理解和成熟,因此不太可能增长。我一直在寻找例子,但没有想到的。

有充分的理由选择第一个,但要小心 - 切换到生产系统中的第二个选项将是一场噩梦。

答案 4 :(得分:2)

第二个更好。第一种是违反第一范式:

http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups_across_columns

答案 5 :(得分:0)

category_option必须具有类别id才能与opton_post建立连接表,否则没有意义来创建第二个表结构。

你可以通过这种结构实现两件事。

1)与post to category建立一对一的关系。 (这意味着如果需要,您可以在将来添加更多类别)

2)在此结构中自动避免使用空值。这意味着不再需要在表或SQL查询中处理空值。

希望这会有所帮助。