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

时间:2009-04-08 00:53:19

标签: database-design hierarchical-data user-defined

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

3 个答案:

答案 0 :(得分:3)

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

unit:
    unit id,
    name,

unit relationship:
    unit id,
    foreign unit id

然后您可以按以下方式使用单位关系表。

unit id与它所描述的单位有关。 foreign unit id应该可以为空。

没有关系记录的unit只能存在于层次结构的根目录中。 unit null foreign unit id可以将unit作为其父级unit。否则,unit必须有另一个instance: instance id, unit id, parent instance_id 作为其父级,并且其类型必须是其关系记录中定义的类型之一。

至于存储实例本身,这应该是直截了当的..

{{1}}

我确信你会需要其他领域(例如名字),但我认为你会得到漂移。

答案 1 :(得分:2)

您需要实现三个概念:

  • “单位类型”及其允许的关联
  • 层次结构
  • 实际单位

这些概念可以在模型中或多或少独立共存,但可以协同工作。

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;
    ....
}

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

答案 2 :(得分:1)

虽然我需要支持多个层次结构(一组子级,多个层次视图),但我正在处理类似的问题。我发现Joe Celko的“树和层次结构在SQL for Smarties”(ISBN:1558609202)很有用。我仍然在研究这个问题,但是在讨论这个话题时经常出现这个问题似乎很合适。