3

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

4

3 回答 3

3

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

unit:
    unit id,
    name,

unit relationship:
    unit id,
    foreign unit id

然后,您可以通过以下方式使用您的单位关系表..

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

没有关系记录的 Aunit只能存在于层次结构的根部。unit带有 a 的Anull foreign unit id可以将任何其他unit作为其父级。否则,aunit必须有另一个unit作为其父级,并且它的类型必须是其关系记录中定义的类型之一。

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

instance:
    instance id,
    unit id,
    parent instance_id

我确定您还需要其他字段(例如姓名),但我假设您会有所了解。

于 2009-04-08T01:09:21.537 回答
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;
    ....
}

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

于 2009-04-08T01:41:11.850 回答
1

尽管我需要支持多个层次结构(一组子级,多个层次结构视图),但我正在处理类似的问题。我发现 Joe Celko 的“Smarties 在 SQL 中的树和层次结构”(ISBN:1558609202)很有用。我仍在努力解决这个问题,但在讨论这个话题时它经常出现,似乎值得一提。

于 2009-09-09T20:25:23.223 回答