数据库建模:包含1个或更多类别的产品

时间:2010-12-12 07:27:33

标签: mysql database database-design

我正在开发一种数据库设计,允许产品分为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. 我需要查询的其他任何疑问?

3 个答案:

答案 0 :(得分:2)

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

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

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


此外,如果您使用 ORM (例如 Doctrine )为您实施树以及操作,您可能会更好。

答案 1 :(得分:0)

  1. 是 - 多对多交叉表是正确的(产品可以在多个类别中,一个类别包含多个产品)。

  2. 我同意这里只有叶子。我希望你想要在他们特定的类别中展示产品,但是会有子卷查询到父版本,此时你可能已经按照名称等方式点击类别表了。 - 经验法则,从非规范化开始,并根据性能需要进行标准化。

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

  4. 鉴于某个类别(类别树中的任何级别),我如何获得根据其分类的产品数量? (通过连接和计数轻松完成 - 与上面相同的注释)。

  5. 当你向前迈进时,你可能会发现更多的疑问,但这就是紧急设计的美妙之处:)

答案 2 :(得分:-1)

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

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

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