【问题标题】:Database Modeling: Product with 1 or more categories数据库建模:具有 1 个或多个类别的产品
【发布时间】:2010-12-12 16:52:21
【问题描述】:

我正在研究一种数据库设计,允许产品属于 1 个或多个类别。类别可以是父子关系。到目前为止,这是我所拥有的:

==================
product
==================
product_id
name

==================
category
==================
category_id
parent_category_id
level
name

==================
product_category
==================
product_id
category_id (leaf node only)

问题

  1. 设计好看吗?
  2. 我只关心product_category->category_id 中的叶节点是否正确? (我想我可以利用这些信息从叶节点一直到根节点)
  3. 给定一个产品,我如何获得该产品所属的类别树?
  4. 给定一个类别(类别树中的任何级别),我如何获得归类于该类别下的产品数量?
  5. 我还需要查看其他任何问题吗?

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    您提供的内容看起来像是数据库中树的正确设计。但是,您的查询可能会变得复杂,并且您会发现自己需要针对某些任务进行多次查询,例如在遍历深度时每个级别都需要一个查询。

    但是,数据库中的树实现也存在完全不同的方法。这有点违反直觉,但是当您查看查询简单性的好处时,很明显它有很多优点。

    阅读:http://articles.sitepoint.com/article/hierarchical-data-database


    此外,如果您使用像 Doctrine 这样的 ORM 来为您实现树以及操作,可能会更好。

    【讨论】:

    • 拥有level 字段是否简化了遍历?
    • 在您的架构中还是在我链接的概念中?嗯..在您的架构中可能没有(至少我现在想不出一个用例..可能有一个退出),但是知道level 在我链接到的设计中可能非常有用(例如:为了只找到一个节点的直接子节点)。请注意,这种设计允许您在 one 查询中找到节点的所有子节点或所有父节点(根路径),而无需递归,这是它的主要优势。深度优先遍历也是微不足道的。我认为,当您引入 level 字段时,广度优先也变得容易。
    • 此解决方案无法回答问题 - 产品需要属于 1 个以上的类别
    【解决方案2】:
    1. 是的 - 多对多交集表是正确的(一个产品可以属于多个类别,一个类别有多个产品)。

    2. 我同意这里也只放叶子。我希望您主要希望在其特定类别中显示产品,但会有滚动到父级的子查询,此时您可能已经在类别表中找到名称等。 - 经验法则,从反规范化开始,然后根据性能需要进行规范化。

    3. product_category 表的内部联接(如果您想查看 SQL,请告诉我)。

    4. 给定一个类别(类别树中的任何级别),我如何获得归类于该类别下的产品数量? (通过连接和计数轻松完成 - 与上述相同)。

    5. 随着您的前进,您可能会发现更多查询,但这就是紧急设计的美妙之处:)

    【讨论】:

    • 您介意给我看一些#3 和#4 的示例SQL 吗?我害怕处理亲子关系。
    【解决方案3】:

    正如其他人已经说过的那样,您的设计还可以。只是一个想法:
    可能可以根据您正在建模的业务以更简单的方式表示类别的层次结构。例如:

    CategoryId    Name
    ==========    ==========
    1             Food
    11            Chocolate
    12            Dairy
    121           Yoghurt
    2             Grocery
    etc...
    

    如果这在您的域中可用,我认为它可以使您的设计更容易。

    【讨论】:

    • 我可以理解有些人可能不同意某个答案,但如果不评论您为什么认为它不是一个好的/正确的答案,就简单地否决它并没有帮助。
    • 这是食品在几个国家的官方分类方式。这也是会计中通常表示帐户层次结构的方式。所以是的,正如我所说,这可能是一个有效的选择,具体取决于域。在某些情况下甚至可能是最佳选择,鉴于我们从问题中获得的数据,我的建议可能是优秀的或不合适的。谢谢@AgileYogi
    猜你喜欢
    • 2015-11-07
    • 2017-03-02
    • 2011-12-07
    • 1970-01-01
    • 2013-09-29
    • 2011-02-09
    • 1970-01-01
    • 2019-07-14
    • 2013-11-22
    相关资源
    最近更新 更多