PHP/Mysql:db条目需要存储多个分类值(cat、subcat、tags)

PHP/Mysql:db条目需要存储多个分类值(cat、subcat、tags),php,mysql,sql,database-design,categories,Php,Mysql,Sql,Database Design,Categories,我面临的这个问题对您来说可能听起来很琐碎,但我想知道,除了枚举类型之外,在一列中还可以使用什么来存储类别、子类别和多个标记的数值 情景: DB条目需要有类别(id=4)、子类别(id=43)和标签(id=78、id=85、id=98、id=112等) tbl_条目有一个“类别”列或类似列,目的是保存这些值(4,43,7,85,98112,…) ENUM真的适合和推荐的存储方式吗 但是,我正在考虑完全省略这样一个列,并应用类似于Wordpress的解决方案—创建分类法(cat、subcat、tag

我面临的这个问题对您来说可能听起来很琐碎,但我想知道,除了枚举类型之外,在一列中还可以使用什么来存储类别、子类别和多个标记的数值

情景:
  • DB条目需要有类别(id=4)、子类别(id=43)和标签(id=78、id=85、id=98、id=112等)
  • tbl_条目有一个“类别”列或类似列,目的是保存这些值(4,43,7,85,98112,…)
  • ENUM真的适合和推荐的存储方式吗

    但是,我正在考虑完全省略这样一个列,并应用类似于Wordpress的解决方案—创建分类法(cat、subcat、tag),然后在另一个名为relationships的表中,将条目的ID与正确的分类法配对。此解决方案的问题是50000个条目将产生如此多的关系行(1个用于cat,1个用于subcat,但最多20个用于标记)

    您能否详细说明建议的方法和/或建议新的方法

    编辑

    以下是避免不惜一切代价将多个值存储在单个列中的建议。感谢

    我正在考虑为cat、subcat和tags创建3个单独的表。
    此外,通过这种方式,我可以使用Martin Fowler的模式“数据映射器”和“表继承”来处理我的应用程序的这一方面(条目分类)。

    如果你想单独访问多个值,永远不要在一列中存储多个值-这是一个等待发生的意外

    忘了multi-id列吧,不管它是如何实现的:想想需要什么来查找所有具有一些标记的行:您需要以文本方式解析所有行的multi-vlue字段,扔掉其中的大部分:每个查询都成为一个带计算的完整表扫描-最坏的情况

    实现这一点的标准方法是使用一个包含关系的联接表,它可能会生成大量记录,但这些记录可以以极快的速度访问,因为它们实际上只是索引


    将其拆分为类别联接表和标记联接表可能会或可能不会进一步加快速度,这取决于您的业务逻辑只需要其中一个的频率。

    为什么需要将其存储在同一列中,为每个类别、子类别和标记一对一创建不同的表,一对多关系
    使用索引/fk和联接获取记录

    谢谢,这是一个选项。不错。我可以告诉你,我几乎在所有的时间都需要这3个选项——条目显示,cat&subcat文本显示在上面或下面。标签可能只是按需显示,但我不确定这是否会改变。这对我来说似乎更方便。但后来我读到enum是邪恶的东西,应该避免。此外,我将按照Eugen Rieck的建议做——避免在一列中存储多个值。现在我只剩下您的建议和Wordpress的功能(几个相互关联的表-术语、分类法、关系)。关系保存在wp_Relationships表中,其中object_id实际上是条目的id(wp post)。我忘了:您认为我如何为单个条目引用cat、多个子类别和多个标记?很明显,每个列都不是一个选项..但是,我没有说要在一个列中存储多个逗号分隔的值,我要说的是为什么需要存储它。。。例如:对于每个wp帖子,为类别(如果是新的)创建一个条目,为子类别(如果是新的)创建一个条目,其中类别id为FK,为标签创建多个条目,子类别id为FK。有意义是吗?这不是一个WP应用程序,我只是在考虑将我的分类相关表的架构类似于Wordpress。是的,现在你的意思更清楚了。这确实是一个很好的建议,与WP的解决方案并不完全相同,但它应该可以工作。请看这个想法,假设您有三个表,Post(id,desc,category_id,tag_id),category(id,parent_id,name),Tags(id,name)子类别,因为您可以在category表本身中创建另一列,使其成为子类别。优点:1)不需要另一个表2)您可以拥有任何No of hierarchy Ok,现在对于完成的每个帖子,您可以搜索是否已存在类别,如果已存在标记如果是,则获取相应的ID n insert,然后在帖子表中插入。。。您还需要创建新的类别/标记并获取ID吗?您可能应该阅读“SQL反模式”一书: