Mysql 数据库建模:具有1个或多个类别的产品
我正在进行一个数据库设计,它允许一个产品包含一个或多个类别。类别可以是父子关系。以下是我目前掌握的情况:Mysql 数据库建模:具有1个或多个类别的产品,mysql,database,database-design,Mysql,Database,Database Design,我正在进行一个数据库设计,它允许一个产品包含一个或多个类别。类别可以是父子关系。以下是我目前掌握的情况: ================== product ================== product_id name ================== category ================== category_id parent_category_id level name ================== product_category ========
==================
product
==================
product_id
name
==================
category
==================
category_id
parent_category_id
level
name
==================
product_category
==================
product_id
category_id (leaf node only)
问题
您所展示的看起来像是数据库中树的正确设计。但是,您的查询可能会变得复杂,并且您可能会发现自己需要对某些任务进行许多查询,例如在遍历深度时,每个级别都需要一个查询 然而,对于数据库中的树实现,也存在一种完全不同的方法。这有点违反直觉,但当您看到查询简单性的好处时,很明显,它有很多优点 阅读:
此外,如果您使用ORM像条令来为您实现树以及操作,您的情况会更好
正如其他人已经说过的,你的设计还可以。只是一个想法:
根据您正在建模的业务,可能有可能以更简单的方式表示类别的层次结构。例如:
CategoryId Name
========== ==========
1 Food
11 Chocolate
12 Dairy
121 Yoghurt
2 Grocery
etc...
如果这在您的领域中可用,我认为它可以使您的设计更简单。您是否介意向我展示一些用于#3和#4的SQL示例?我害怕处理父子关系。使用
level
字段是否简化了遍历?在您的模式中还是在我链接的概念中?陛下在您的模式中,可能没有(至少我现在想不出一个用例..可能有一个存在),但是知道级别在我链接到的设计中非常有用(比如:为了只找到节点的直接子节点)。注意,这种设计允许您在一个查询中查找节点的所有子节点或所有父节点(根路径),而无需递归,这是它的主要优点。深度优先遍历也很简单。我认为,当您引入级别
字段时,宽度优先也变得很容易。此解决方案无法回答问题-产品需要在多个类别中。我可以理解,有些人可能不同意答案,但是,如果你不评论为什么你认为这不是一个好的/正确的答案,那么简单地否决它也无济于事。这就是食品在几个国家的官方分类方式。这也是会计中通常表示科目层次的方式。因此,是的,正如我所说,这可能是一个有效的选择,取决于域名。在某些情况下,我的建议可能是最好的选择,考虑到我们从问题中获得的数据,我的建议可能是优秀的,也可能是不合适的。谢谢@AgileYogi