Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库建模:具有1个或多个类别的产品_Mysql_Database_Database Design - Fatal编程技术网

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)
问题

  • 这个设计好看吗
  • 我只关心product\u category->category\u id中的叶节点对吗?(我想我可以利用这些信息从叶节点一直到根节点)
  • 给定一个产品,如何获取该产品所属的类别树
  • 给定一个类别(类别树中的任何级别),我如何获得该类别下分类的产品数量
  • 我还需要调查其他问题吗

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

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

    阅读:


    此外,如果您使用ORM条令来为您实现树以及操作,您的情况会更好

  • 是-多对多交叉表是正确的(一个产品可以在多个类别中,一个类别有多个产品)

  • 我也同意只在这里放叶子。我希望您首先希望显示特定类别中的产品,但会有子查询汇总到父级,此时您可能已经在类别表中找到名称等-经验法则,从非规范化开始,并根据性能需要进行规范化

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

  • 给定一个类别(类别树中的任何级别),我如何获得该类别下分类的产品数量?(通过连接和计数很容易完成-与上面的注释相同)

  • 在前进的过程中,您可能会发现更多的问题,但这就是紧急设计的美妙之处:)


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

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

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

    您是否介意向我展示一些用于#3和#4的SQL示例?我害怕处理父子关系。使用
    level
    字段是否简化了遍历?在您的模式中还是在我链接的概念中?陛下在您的模式中,可能没有(至少我现在想不出一个用例..可能有一个存在),但是知道
    级别
    在我链接到的设计中非常有用(比如:为了只找到节点的直接子节点)。注意,这种设计允许您在一个查询中查找节点的所有子节点或所有父节点(根路径),而无需递归,这是它的主要优点。深度优先遍历也很简单。我认为,当您引入
    级别
    字段时,宽度优先也变得很容易。此解决方案无法回答问题-产品需要在多个类别中。我可以理解,有些人可能不同意答案,但是,如果你不评论为什么你认为这不是一个好的/正确的答案,那么简单地否决它也无济于事。这就是食品在几个国家的官方分类方式。这也是会计中通常表示科目层次的方式。因此,是的,正如我所说,这可能是一个有效的选择,取决于域名。在某些情况下,我的建议可能是最好的选择,考虑到我们从问题中获得的数据,我的建议可能是优秀的,也可能是不合适的。谢谢@AgileYogi