Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.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 如何将分层信息存储到数据库中?_Mysql_Database Design_Hierarchical Data_Database Schema - Fatal编程技术网

Mysql 如何将分层信息存储到数据库中?

Mysql 如何将分层信息存储到数据库中?,mysql,database-design,hierarchical-data,database-schema,Mysql,Database Design,Hierarchical Data,Database Schema,我有以下信息,应该通过使用web表单上的几个相关选择字段来检索: 用户将能够添加新类别 Food - Fruits - Tropical - Pineapples - Pineapples - Brazil - Pineapples - Hawaii - Coconuts - Continental - Orange - Fish .... 这些数据应该来自数据库 我意识到为这里介绍的每个类别创建一个

我有以下信息,应该通过使用web表单上的几个相关选择字段来检索:

用户将能够添加新类别

Food
 - Fruits
   - Tropical
      - Pineapples
          - Pineapples - Brazil
          - Pineapples - Hawaii
      - Coconuts
   - Continental
      - Orange
 - Fish

....
这些数据应该来自数据库

我意识到为这里介绍的每个类别创建一个表可能不是一个好的模式,所以我想问,是否有任何标准的方法来处理这个问题

我也知道这个模式示例:


有没有其他更直观的方法来存储此类信息?

您提供的链接介绍了存储此类信息的两种标准方法:

邻接表 嵌套集
卡武给了你答案。。。。递归关系表将与自身相关,也称为Pig的Ear关系

您的示例显示了一个具有多个子项的父项,但并没有说明一个项是否可以属于多个父项。橘子能在“热带”和“柑橘”中出现吗

每行有一个id和一个父id,父id指向另一行的id

id=1 name='Fruits' parent_id=0
id=2 name='Citrus' parent_id=1
id=3 name='Bitter Lemon' parent_id=2
id=4 name='Pink Grapefruit' parent_id=2
下面是一些使用这种关系提供无限父子关系的模式示例:


你的问题没有提到的一个问题是,所有水果是否都具有相同的属性

如果所有水果都具有相同的属性,那么告诉您查看提供的链接并阅读有关邻接列表和嵌套集的内容的答案是正确的

如果新水果可以有新属性,那么可以添加新水果的用户也可以添加新属性。这很容易就会变成一团乱麻。如果两个用户发明了同一个属性,但给它起了不同的名字,这可能是个问题。如果两个用户发明了不同的属性,但给了他们相同的名称,那是另一个问题

您不妨说,从概念上讲,每个用户都有自己的数据库,并且不能进行有意义的查询来组合来自不同用户的数据。问题是,数据库的任务几乎总是早晚把来自不同用户的所有数据汇集在一起


这就是您面临的几乎不可能解决的数据管理问题。

谢谢。那么这些就是方法,嗯?是 啊我通常对较大的层次数据集使用嵌套集,对较小的数据集使用邻接列表。您链接到的文章介绍了不同方法的优点。@MEM-您的问题是用户可以添加类别。我认为这应该排除嵌套集的可能性,因为本文中显示的对LFT和RGT值进行洗牌的机制相当可怕。顺便说一句,在纯SQL中处理分层数据是Oracle可以提供的一个领域。请看下面的答案,了解一个概述:它应该比父id容易多少?在我看来,在一个完美的世界中,我们都将使用XML数据库,它可以以更自然的形式存储关系数据或层次数据。这里最难的部分就是这个。我将需要交叉信息,并比较。。。我不知道如何在这里实现这一点。也许会实现。假设用户A作为产品橙色A,用户B作为产品橙色B。一个将其橙色存储在柑橘中,另一个将存储在热带-我不介意,因为两者都有意义。因此,我们将允许我们的用户通过导航到柑橘或热带找到该产品橙色,如果他们去柑橘,他们将找到用户A橙色,如果他们去热带,他们将找到用户B橙色,但他们将找到和橙色。这并不完美。。。但如果关键是找到并储存一个橘子,即使是多余的,我也可以带着它离开。。。但它仍然没有解决用户A明确希望将橙色A存储在多个类别下的情况。