Php 我应该创建另一个表还是只使用数组?(是否正常化)

Php 我应该创建另一个表还是只使用数组?(是否正常化),php,mysql,normalization,denormalization,Php,Mysql,Normalization,Denormalization,目前的情况是,主题被分为三大类。有可能添加3个以上的类别,但上级希望实现在一个主题中添加1个以上类别的功能 我最初的db设计将categoryID作为主题信息表中的外键。从一开始这可能是个坏主意,但我认为他们只设置了3个类别,这样做可以减少查询 因此,从我所看到的,我现在有两个选择: 1) 以逗号分隔的字符串形式输入categoryID,我在php端解析该字符串。 2) 重组DB并将categoryID提取到其自己的categoryID和TopiId表中 我想知道大家是怎么想的。我的第一反应是重

目前的情况是,主题被分为三大类。有可能添加3个以上的类别,但上级希望实现在一个主题中添加1个以上类别的功能

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

因此,从我所看到的,我现在有两个选择: 1) 以逗号分隔的字符串形式输入categoryID,我在php端解析该字符串。 2) 重组DB并将categoryID提取到其自己的categoryID和TopiId表中

我想知道大家是怎么想的。我的第一反应是重组数据库。但是,当我考虑第一个选项时,它是最容易实现的,并且通过改变数据库来破坏现有内容的可能性最小。但是,这也会导致非标准化,并可能导致数据不一致

我已经了解到,只要您接受以不一致的数据换取性能的风险,反规范化就可以了。在你看来,我是否会因为这一风险而在绩效上获得更多收益?任何关于我在这种情况下应该做什么的意见都将不胜感激

谢谢你的帮助,

Levi

不要将非规范化(一个很好的例子是将SO问题的投票数与问题保持在一起,而不是每次都从“投票”表中计算)与逗号分隔的ID列表相混淆

建立适当的多对多关系模型;用逗号分隔的方法会(也会)出现很多问题。举几个例子:

  • 没有引用完整性
  • 几乎不可能在连接中使用
  • 无法充分索引;不可扩展

  • 你最好的选择是,像你说的那样,建立一个categoryID-topicID对的数据库,以找到主题所属的类别

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


    花点时间重新构造数据库,您将得到更好的结果。

    如果您需要在数据库管理系统中对单个项目执行某些操作,请不要以列表形式存储它们。这将使您的查询在表变大时像狗一样运行。当然,如果你只想将列表作为一个单元来处理,那么这样存储它们是可以的

    但是你最好确保你总是将列表作为一个单元来对待,不要作弊,说它们是一个单元,然后把它们分到其他地方——最好让DBMS为你这样做

    您应该始终首先执行3NF,然后,如果并且仅当您有性能问题时,对速度进行非规范化


    你在问题中提到的那些领域不是你将作为一个整体来对待的那种。您需要对列表中的各个元素进行处理,以便将它们分解到另一个表中。

    所有优点,关于不可伸缩性的第三个优点是我最初在DB设计中遇到的问题。+1此外,更难进行各种聚合查询,如计数、求和,或者平均列表中的值。好的,我将把它分解到另一个表中,听起来我会有更少的错误。奇怪的是,列表是否仅在按原样显示时才被视为一个单元?所以,如果我有“苹果,桔子,香蕉,奇异果”,我用它来输出“我喜欢苹果,桔子,香蕉,奇异果”。这样可以吗?输出这个“我喜欢:-苹果-猕猴桃-香蕉-橙子”是个坏主意,因为我必须把字符串分开,然后按顺序显示?有没有一个真实的例子,你可以考虑使用一个列表作为一个单元?是的,很好。如果你只是想按原样把它拉出来,而不是操纵它,你可以像那样存储它。这是因为DBMS或您的程序没有额外的工作来处理它。在这种情况下,这样做实际上更好,因为它比将单个列重新组合成字符串更快:-)一个真实的例子?你可以在交友网站上列出你的兴趣爱好(这可能是任何东西,所以作为一个查找表可能没有意义)。你很可能会进入“16世纪的沙滩漫步、Java开发和酷刑设备”,这将以原样呈现给潜在的候选人(老实说,他们可能会拼命地跑)。