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

时间:2011-05-18 22:00:51

标签: mysql database-design hierarchical-data database-schema

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

用户将能够添加新类别。

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

....

此数据应来自数据库。

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

我也知道这个架构示例: Managing Hierarchical Data in MySQL

是否还有其他(可能更直观的方式)存储此类信息?

3 个答案:

答案 0 :(得分:2)

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

  • 邻接清单
  • 嵌套集

答案 1 :(得分:2)

你的问题没有提出的一个问题是所有水果是否具有相同的属性。

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

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

您也可以这么说,从概念上讲,每个用户都有自己的数据库,并且无法构建组合来自不同用户的数据的有意义的查询。问题是,数据库的任务迟早总是包含来自不同用户的所有数据。

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

答案 2 :(得分:1)

Kawu给你答案......一个递归关系(表格将与自身相关)又名 Pig's Ear 关系。

您的示例显示了具有多个子项的父项,但您没有说项目是否属于多个父项。橙子可以在'热带'和'柑橘'中吗?

每行都有一个id和一个parent_id,其中parent_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

以下是使用此类关系提供无限制的父子关系的模式的一些示例: