我正在创建一个植物数据库,其中的植物将按其分类法进行组织:
生命 域 王国 门 类 订购 家庭 种 种
我正在考虑使用文章Managing Hierarchical Data in MySQL提出的示例,但是它将上面的列表添加为表格中的记录....我不确定这是否是最好的事情因为每个属我会有多个物种,每个家族有多个属等等。你会建议什么是解决这个问题的最佳方法。提前谢谢。
答案 0 :(得分:11)
我使用了类似的数据,我分为两部分。在PostgreSQL语法中。
首先是分类结构(Family,Genus,Species,...):
CREATE TABLE taxonomic_units (
id serial PRIMARY KEY,
name varchar(20) NOT NULL,
parent_id integer REFERENCES taxonomic_units(id)
);
1 | Life | NULL
2 | Domain | 1
...
7 | Family | 6
8 | Genus | 7
9 | Species | 8
其次是植物学数据的描述和存储:
CREATE TABLE taxons (
id serial PRIMARY KEY,
suptaxon_id integer REFERENCES taxons(id),
taxonomic_unit_id integer NOT NULL REFERENCES taxonomic_units(id),
name varchar(50) NOT NULL,
authority varchar(50)
);
100 | NULL | 8 | Ocimum | L.
101 | 100 | 9 | basilicum | L.
102 | 100 | 9 | gratissim | L.
答案 1 :(得分:3)
我不确定我是否真的会接受那篇文章。当类别本身是可变的时,图形结构将需要。例如,所有突然的分类学家决定在属和物种之间增加三个新的等级,等等。
来自文章:
......分层数据的管理不是关系数据库的目的。
实际上,它正是它的目的:
http://en.wikipedia.org/wiki/Hierarchical_database_model
随着Codd的关系模型成为几乎所有主流数据库管理系统所使用的事实标准,分层数据模型失去了吸引力。
我会首先编写一个加入所有表的视图,以便将这些作为列:
Life Domain Kingdom Phylum Class Order Family Genus Species
现在您可以按照自己喜欢的方式查询该视图,而不必担心任何连接。轻松:)
答案 2 :(得分:2)
您可以从http://itis.gov下载完整的分类数据,并且每月或多或少地更新数据。他们提供的数据包括物化路径 - 数据库中的每个物种都有一个高于它的所有级别的字符串,如面包屑字符串或文件系统路径。
我使用此数据在演示文稿Models for Hierarchical Data中设计演示。我将物化路径数据转换为Closure Table。
答案 3 :(得分:0)
听起来更像是一张图。我想知道NEO4J是否是更好的选择。
答案 4 :(得分:0)
在关系数据库中有几种表示分层数据的方法,尽管Nodu解决方案可能更容易使用,如@duffymo所述。所以假设一个RDBMS,see my question on the topic for an enumeration of a half dozen possibilities。对于你的情况,我会带着一条物化路径来看看家谱很容易。如果层次结构定期更改,我可能还会建模为邻接列表并使用触发器更新实现路径。