层次结构中的可选关系

时间:2011-02-14 16:50:13

标签: database-design

我有一个层次结构区域 - >区域 - >区域是可选的扇区,即特定扇区可以属于区域,但用户可能不想在区域级别分解。此外,区域与区域不同,它们具有不同的属性,而区域实际上是区域的集合

部门还有其他与层次结构相关的实体。

我想知道的是在数据库中对此进行建模的最佳方法是什么?我之前在类似的场景中做过这个,并使用了一个虚拟区域实体,然后允许存储扇区。

有人有更好的想法吗?

谢谢, 标记

2 个答案:

答案 0 :(得分:1)

如果区域和区域在您的应用程序中足够相似,您可能需要考虑为两者使用相同的表(并使用标志列来区分给定行所代表的类型)。在这种情况下,任何区域/区域都可以具有父区域/区域,并且每个区域必须具有父区域/区域。

例如:

Table Container:
    Field container_id
    Field container_type
    Field parent_container_id (NULL)
Table Sector:
    Field parent_container_id

答案 1 :(得分:0)

你不能把它建模为IS-A关系吗?区域始终是一个区域,扇区始终是一个区域。

区域和部门之间存在可选关系。

create  table dbo.area(
   area_id   numeric(8,0)  identity,
   parent_id   numeric(8,0)  not null, --whatever the parent table of area table is
   flag1   bit  not null,
   prop1 varchar(100) not null, -- many more props...
   constraint pk_0 primary key clustered ( area_id )
)

create  table dbo.zone(
   area_id   numeric(8,0)  not null,
   prop_z1   varchar(50)  null,

    constraint pk_1 primary key clustered ( area_id )
)

alter table dbo.zone
    add constraint fk_1 foreign key ( area_id )
    references dbo.area ( area_id )

-- same for sector

create  table dbo.sector(
   area_id   numeric(8,0)  not null,
   prop_s2   varchar(50)  null,

    constraint pk_2 primary key clustered ( area_id )
)

alter table dbo.sector
    add constraint fk_s1 foreign key ( area_id )
    references dbo.area ( area_id )

这是一个奇怪的设计,但是嘿,你已经要求任何替代方案。

您可以在扇区表中添加一个或多个zone_id列,如果您想让自己真的很难,请为这些列添加外键约束。

相关问题