我应该制作另一个表还是只使用数组? (规范化或不规范化)

时间:2009-10-29 02:42:32

标签: php mysql normalization denormalization

目前的情况是主题按3个主要类别排序。有可能增加的不仅仅是3个类别,但是更高层次的人希望能够实现为主题添加多于1个类别的能力。

我的原始数据库设计在主题信息表中将categoryID作为外键。从一开始这可能是个坏主意,但我认为它们只设置了3个类别,这样做可以减少查询次数。

所以我可以看到我现在有两个选择: 1)输入categoryID作为逗号分隔的字符串,我在php端解析。 2)重构数据库并将categoryID拉出到自己的categoryID和topicID表中。

我想知道大家都在想这个。我的第一直觉是重组数据库。但是当我考虑它时,第一个选择是最容易实现,并且最不可能通过改变数据库来破坏现有的东西。这也可能导致去标准化,并且可能会导致数据不一致。

我已经读过,只要您接受以不一致的数据换取性能的风险,就可以解除规范化。在您看来,我会因此风险获得更多的表现吗?关于在这种情况下我应该做些什么的任何意见都将不胜感激。

感谢您的帮助,
列维

3 个答案:

答案 0 :(得分:3)

不要混淆非规范化(其中一个很好的例子是将问题的数量与问题一起保留,而不是每次从“投票”表中计算)与咒语分隔的ids列表的憎恶。

建立适当的多对多关系;有很多东西可以(并且会)以逗号分隔的方法出错。仅举几例:

  1. 没有参照完整性。
  2. 接下来无法在连接中使用。
  3. 无法充分索引;不可伸缩。

答案 1 :(得分:0)

您最好的选择是拥有一个数据库,就像您说的那样,使用categoryID-topicID对来查找主题所属的类别。

你可以通过爆炸classID中的字符串来实现另一种方式,但是当你搜索某个类别中的任何主题时,你必须遍历每个字段并在其上运行LIKE ...更加资源密集。

花点时间重新构建数据库,最终会得到更好的结果。

答案 2 :(得分:0)

如果您需要在DBMS中使用单个项目执行某些操作,请以列表形式存储它们。当您的桌子变大时,这将使您的查询像狗一样运行。当然,如果您只是将列表视为一个单元,那么可以将它们存储起来。

但你最好确定你总是将列表视为一个单元,并且没有作弊,说它们是一个单位,然后将它们分散到其他地方 - 最好让DBMS为你做这件事

你应该首先总是做3NF,然后,只有当你遇到性能问题时,才能对速度进行非规范化。

你在问题​​中谈论的那些领域并不是你将作为一个整体来对待的那种。您需要对列表中的各个元素执行操作,因此应将它们分成另一个表。