Database design 在数据库中为用户定义的层次关系建模的最佳方法是什么?

Database design 在数据库中为用户定义的层次关系建模的最佳方法是什么?,database-design,hierarchical-data,user-defined,Database Design,Hierarchical Data,User Defined,本质上,我希望用户能够定义层次模型,但我需要允许用户在其定义的模型中存储数据。这有意义吗?因此,用户将能够创建新的“单元类型”,以分层方式进行组织,并决定如何组织这些类型的单元。一个简单的例子:在我假设的界面中,用户创建了三种单元类型:主干、分支和叶。然后,用户定义它们之间的关系。叶可以存在于层次结构中的任何点,分支必须有一个主干作为父级。然后,用户可以创建这些单元类型的实例(作为单元),并可以根据其模型中定义的规则组织它们。。。在数据库中有这样做的好方法吗?这是一个非常广泛的问题,但这可能会为

本质上,我希望用户能够定义层次模型,但我需要允许用户在其定义的模型中存储数据。这有意义吗?因此,用户将能够创建新的“单元类型”,以分层方式进行组织,并决定如何组织这些类型的单元。一个简单的例子:在我假设的界面中,用户创建了三种单元类型:主干、分支和叶。然后,用户定义它们之间的关系。叶可以存在于层次结构中的任何点,分支必须有一个主干作为父级。然后,用户可以创建这些单元类型的实例(作为单元),并可以根据其模型中定义的规则组织它们。。。在数据库中有这样做的好方法吗?

这是一个非常广泛的问题,但这可能会为您指明正确的方向。请注意,您只能在数据库中存储关系规则。强制执行它们将取决于您的客户代码。试试这个尺码

unit:
    unit id,
    name,

unit relationship:
    unit id,
    foreign unit id
然后,您可以按以下方式使用单位关系表

单元id
与所描述的单元相关。
外部单元id
应为空

没有关系记录的
单元
只能存在于继承权的根目录下。带有
null
外部单位id
单位
可以将任何其他
单位
作为其父单位。否则,一个
单元
必须有另一个
单元
作为其父级,并且它的类型必须是其关系记录中定义的类型之一

至于存储实例本身,这应该很简单

instance:
    instance id,
    unit id,
    parent instance_id

我确信您还需要其他字段(例如名称),但我假设您已经了解了要点。

您需要实现三个概念:

  • “单位类型”及其允许的关联
  • 等级制度
  • 实际单位
这些概念可以在模型中或多或少独立地共存,但可以协同工作

create table unittype
(
    id int;
    name varchar(20);
)

create table unitrelationship
(
    id int;
    parent_id int;
)
您可以将层次结构建模为自引用表:

create table hierarchy
(
    id int;
    parent_id int;
    unit_type_id int;
    unit_id int;
)
然后,您可以将单元实例放在一个或多个表中,并按照您描述的方式处理它们

create table unit
{
    id int;
    ....
}

好消息是,您只限制了允许的父类型,这可以在用户界面中轻松实施,例如,通过从允许类型的所有现有单元列表中选择父类型。

我正在处理一个类似的问题,尽管我需要支持多个层次结构(一组子级,多个层次视图)。我找到了Joe Celko的“智能化SQL中的树和层次结构”(ISBN:1558609202)有用。我仍在研究这个问题,但在讨论这个话题时,它经常出现,似乎很适合提及。

这就是所谓的“邻接列表”吗?不,这是自下而上定义的树结构(换句话说,通过在子对象上指示父对象而不是在父对象上指示子对象列表来定义子对象)。邻接列表允许循环连接,而树则不允许。因此,要构建树,我不需要对每个节点进行查询来确定父节点吗?或者这取决于RDBMS吗?我想我已经看到CONNECT_BY_之前在Oracle中用于树漫游。树的构建最好在客户端完成,因为SQL不适用于(事实上,它不支持)递归,至少在查询中是这样。如果需要的话,你可以在你的父子关系中深入到n个级别,但基本上每个级别都必须有一个左自连接。