我正在开发一种数据库设计,允许产品分为1个或更多类别。类别可以是父子关系。这是我到目前为止所做的:
==================
product
==================
product_id
name
==================
category
==================
category_id
parent_category_id
level
name
==================
product_category
==================
product_id
category_id (leaf node only)
问题
答案 0 :(得分:2)
您所呈现的内容看起来像是数据库中树的正确设计。但是,您的查询可能会变得复杂,您可能会发现自己需要对某些任务进行多次查询,例如遍历深度时每个级别的查询。
但是,在数据库中存在一种完全不同的树实现方法。这有点违反直觉,但是当你看到查询简单性的好处时,很明显有很多优点。
请阅读:http://articles.sitepoint.com/article/hierarchical-data-database
此外,如果您使用 ORM (例如 Doctrine )为您实施树以及操作,您可能会更好。
答案 1 :(得分:0)
是 - 多对多交叉表是正确的(产品可以在多个类别中,一个类别包含多个产品)。
我同意这里只有叶子。我希望你想要在他们特定的类别中展示产品,但是会有子卷查询到父版本,此时你可能已经按照名称等方式点击类别表了。 - 经验法则,从非规范化开始,并根据性能需要进行标准化。
product_category表上的内部联接(如果您想查看SQL,请告诉我。)
鉴于某个类别(类别树中的任何级别),我如何获得根据其分类的产品数量? (通过连接和计数轻松完成 - 与上面相同的注释)。
当你向前迈进时,你可能会发现更多的疑问,但这就是紧急设计的美妙之处:)
答案 2 :(得分:-1)
你的设计还可以,正如其他人已经说过的那样。只是一个想法:
根据您正在建模的业务,它可能可能以更简单的方式表示类别的层次结构。例如:
CategoryId Name
========== ==========
1 Food
11 Chocolate
12 Dairy
121 Yoghurt
2 Grocery
etc...
如果这在您的域中可用,我认为它可以使您的设计更容易。