2011-02-14 78 views
0

我有一個層次結構Area - > Zone - > Sector,其中Zone是可選的,即特定扇區可能屬於某個區域,但用戶可能不想在區域級別分解。此外,行業與區域不一樣,它們具有不同的屬性,區域實際上是行業的集合。層次結構中的可選關係

行業還有其他實體與層次結構相關聯。

我想知道的是什麼是在數據庫中對此進行建模的最佳方法?我之前在類似的情況下完成了此操作,並使用虛擬區域實體來允許存儲扇區。

有人有什麼更好的想法?

謝謝, 馬克

回答

1

如果區域和區域是有效地在你的應用很相似,你可能要考慮使用兩個相同的表(和使用標誌列來區分一個給定的行代表型) 。在這種情況下,任何區域/區域可以具有父區域/區域,並且每個區域必須具有父區域/區域。

例如:

Table Container: 
    Field container_id 
    Field container_type 
    Field parent_container_id (NULL) 
Table Sector: 
    Field parent_container_id 
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列,如果您想讓自己真的很難,請爲這些列添加外鍵約束。