gpt4 book ai didi

mysql - 类别和标签的数据结构

转载 作者:搜寻专家 更新时间:2023-10-30 23:04:13 25 4
gpt4 key购买 nike

我正在构建一个企业目录,用户可以在其中为其企业创建列表。目录结构如下:

  • 有类别和标签
  • 一个类别可以有很多标签。一个标签只能属于一个类别
  • 列表分配给类别和类别标签

当前数据结构如下:

category               tag
============ ===========
id id
name name
category_id (FK)


listing listing_category listing_category_tag
============ ================ ====================
id id listing_category_id (FK)
name listing_id (FK) tag_id (FK)
etc category_id (FK)

随着目录的增加,我将不可避免地要添加新的类别和标签,而现有的可能需要存档。这可能意味着某些列表需要更新以引用新创建的类别和标签。

这个数据结构是否有效地设置来处理这样的情况?我想避免列表中的标签与当前类别分配不匹配的情况。

最佳答案

您提供的设计是合理的。我将在此处列出一些灰色区域,与其说是为了挑战您的方法,不如说是为了激发思考:

  • listing_category 引用类别。标签还引用类别。 listing_category_tag 引用标签和列表类别,因此如果未维护引用完整性,您可能有一个 listing_category_tag 引用与标签类别不同的​​类别相关联的列表。我认为这表明设计不在 Boyce-Codd Normal Form 中但也许这是第三常态?

  • 正如您所描述的随着时间的推移改变类别和标签的可能性,这可能会像滚雪球一样变成一团乱七八糟的引用依赖关系。我知道这在理论上听起来不错,但在实际操作中,当设计允许引用不一致时,小错误很容易混合在一起。 (是的,约束,但同样,在实际操作中,这是很容易偏离轨道的事情。)

您是否考虑过一种更简单、更非规范化的方法?这变得越来越普遍,并在一些非常大的成功网站上得到广泛使用。例如:

listing           listing_category_tag
========== ====================
id listing_id
name category_name
etc. tag_name

使用 (category_name, tag_name) 在 listing_category_tag 上放置一个复合索引。当您想要一个类别列表时,只需select distinct(category_name),当您想要一个类别的唯一标签列表时,select distinct(tag_name) where category=?

您可能会惊奇地发现,即使是数百万个列表,它的表现也会如此出色,而且实现和维护起来会变得非常简单且不易出错。

希望对您有所帮助!

关于mysql - 类别和标签的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28752770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com