Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 哪个表模式更好?_Mysql_Database Design_Schema - Fatal编程技术网

Mysql 哪个表模式更好?

Mysql 哪个表模式更好?,mysql,database-design,schema,Mysql,Database Design,Schema,哪种结构更好 表1 postid category1 category2 category3 2 a b d 3 a c null 或 邮政桌 postid 2 3 post option 2 a 2 b 2 d 3 a 3 c 类别选项表 category option category1 a category2

哪种结构更好

表1

postid category1 category2 category3
2            a         b        d

3            a         c       null

邮政桌

postid
2
3
post option
2      a
2      b
2      d 
3      a
3      c
类别选项表

category     option

category1      a
category2      b
category3      c
category4      d
选项(u post table)

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

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

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

如果你用第一种方式做,如果有新的类别4,5,6,7,8,你会怎么做。。。来是否向表中添加新列

而且,我不知道你是否有这样的要求,“有多少篇文章的类别选项是‘c’”?
第二个很容易统计,但是第一个

取决于需求

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


您的第一个选项更易于编码,第二个选项更具模块化设计和可扩展性。

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

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

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


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

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


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


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

category\u选项必须具有category id才能使用opton\u post创建连接表,否则无法创建第二个表结构

通过这种结构,您可以实现两件事

1) 与“发布到”类别建立一对一关系。(这意味着您可以在将来根据需要添加更多类别)

2) 在此结构中,自动避免空值。这意味着不再在表或sql查询中处理空值


希望这能有所帮助。

这真的取决于你想要实现什么?通常情况下,第二个填充是规范化视图。因此它可能更好,在某些情况下更快;在其他情况下,第一个将更容易和更快;如果答案太简单,请给出更多的细节。有很多好的地方可以使用平桌结构。我同意——这不是正确的答案。它是高度情景化的。当你说join table时,你的意思是像select*from table as t1,table as t2和t1。option=a和t2。option=b和t1。postid=2和t1。postid=t2。postid?这是一个优化查询?有更好的解决方案吗?是的,类似这样的,尽管通常使用更现代的语法(谷歌的JOIN关键字)。连接可能非常快,也可能非常慢,这取决于许多因素,而不仅仅是索引。我强烈建议阅读一般索引的性能分支,特别是连接。有时为了性能而违反正常形式是值得的,特别是如果您知道这只是一个临时情况,一个短期项目,或者永远不会扩大规模。但选项2更多的是“书本和理论”,是“正确”的方法。