哪种结构更好?
表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
似乎第一个结构的建立查询比第二个结构更容易。
答案 0 :(得分:3)
这两种结构模拟了不同的东西。第一个严格地仅允许(最多)3个类别(并按位置区分类别),而第二个类别可以模拟任意数量的类别(不按位置区分)。哪一个更好取决于你想要完成什么...
在纯技术级别上,第二个可能需要JOIN来进行某些查询,其中第一个查询可以满足来自单个(且唯一)表的查询。这是否是一个问题,再取决于具体情况......
答案 1 :(得分:2)
第二个更好。这是典型的很多2连接表案例。
如果以第一种方式进行,如果有新的类别类别4,5,6,7,8,你会怎么做?来?在表中添加新列?
而且,我不知道你是否有这样的要求,“有多少个帖子有类别选项'c'”? 第二个很容易做统计,但第一个......
答案 2 :(得分:2)
取决于要求......
您是否预计会随着时间的推移增加选项数量?
您的第一个选项是更容易编码,第二个选项更加模块化设计和可扩展。
答案 3 :(得分:2)
这在很大程度上取决于类别的性质。如果列表是固定的并且不太可能增长,那么第一个结构工作得很好并且可以更容易使用。如果类别列表可能会增长,那么第二个选项将会更好。
如果类别值稀疏也很重要。如果大多数类别没有值,那么第二种方法将占用更少的空间。如果每个项目的每个类别都有值,那么这不是问题。
在这种情况下,了解“可能”的含义非常重要。这并不意味着设计师不认为它会增长。这意味着类别列表已被充分理解和成熟,因此不太可能增长。我一直在寻找例子,但没有想到的。
有充分的理由选择第一个,但要小心 - 切换到生产系统中的第二个选项将是一场噩梦。
答案 4 :(得分:2)
答案 5 :(得分:0)
category_option必须具有类别id才能与opton_post建立连接表,否则没有意义来创建第二个表结构。
你可以通过这种结构实现两件事。
1)与post to category建立一对一的关系。 (这意味着如果需要,您可以在将来添加更多类别)
2)在此结构中自动避免使用空值。这意味着不再需要在表或SQL查询中处理空值。
希望这会有所帮助。