目前的情况是主题按3个主要类别排序。有可能增加的不仅仅是3个类别,但是更高层次的人希望能够实现为主题添加多于1个类别的能力。
我的原始数据库设计在主题信息表中将categoryID作为外键。从一开始这可能是个坏主意,但我认为它们只设置了3个类别,这样做可以减少查询次数。
所以我可以看到我现在有两个选择: 1)输入categoryID作为逗号分隔的字符串,我在php端解析。 2)重构数据库并将categoryID拉出到自己的categoryID和topicID表中。
我想知道大家都在想这个。我的第一直觉是重组数据库。但是当我考虑它时,第一个选择是最容易实现,并且最不可能通过改变数据库来破坏现有的东西。这也可能导致去标准化,并且可能会导致数据不一致。
我已经读过,只要您接受以不一致的数据换取性能的风险,就可以解除规范化。在您看来,我会因此风险获得更多的表现吗?关于在这种情况下我应该做些什么的任何意见都将不胜感激。
感谢您的帮助,
列维
答案 0 :(得分:3)
不要混淆非规范化(其中一个很好的例子是将问题的数量与问题一起保留,而不是每次从“投票”表中计算)与咒语分隔的ids列表的憎恶。
建立适当的多对多关系;有很多东西可以(并且会)以逗号分隔的方法出错。仅举几例:
答案 1 :(得分:0)
您最好的选择是拥有一个数据库,就像您说的那样,使用categoryID-topicID对来查找主题所属的类别。
你可以通过爆炸classID中的字符串来实现另一种方式,但是当你搜索某个类别中的任何主题时,你必须遍历每个字段并在其上运行LIKE ...更加资源密集。
花点时间重新构建数据库,最终会得到更好的结果。
答案 2 :(得分:0)
如果您需要在DBMS中使用单个项目执行某些操作,请不以列表形式存储它们。当您的桌子变大时,这将使您的查询像狗一样运行。当然,如果您只是将列表视为一个单元,那么可以将它们存储起来。
但你最好确定你总是将列表视为一个单元,并且没有作弊,说它们是一个单位,然后将它们分散到其他地方 - 最好让DBMS为你做这件事
你应该首先总是做3NF,然后,只有当你遇到性能问题时,才能对速度进行非规范化。
你在问题中谈论的那些领域并不是你将作为一个整体来对待的那种。您需要对列表中的各个元素执行操作,因此应将它们分成另一个表。