2017-03-31 55 views
0

我想設計一個具有多個多對多結點表的數據庫,但每個多對多都是基於先前表的級聯選項。DB模式設計 - 設計多個多對多的表

例如:我們從四個表格及其主鍵開始。

樣式表 - >樣式ID(PK)
織物表 - > FabricID(PK)
身體表 - > BodyID(PK)
顏色表 - > ColorID(PK)

用戶選擇一個樣式,然後選擇一個結構,所以這很容易定義多對多。

StyleFabric表 - > StyleID,FabricID(複合PK)

現在,這是我感到困惑。選擇Style和Fabric後的用戶現在可以選擇Body。所以,我創建了一個名爲表:

StyleFabricBody表 - > StyleID,FabricID,BodyID(複合PK)

現在根據款式,面料和身體,用戶可以選擇一種顏色

StyleFabricBodyColor表 - > StyleID,FabricID,BodyID,ColorID(複合PK)

希望你可以看到圖案現在我有5個表格要添加。

這是連接主表的正確方法嗎?

+0

你可以有一個表 - 項目(或產品或任何你想要調用用戶選擇的項目),用UserID和所有9個代表風格,結構,主體,顏色等的ID。順便說一下,這並不是多對多的關係。 – Anand

+1

沒關係,刪除我的舊評論,我錯過了關於級聯選擇的一點......所以爲了澄清,您的意思是如果用戶選擇了樣式X,那麼它們僅限於面料Y,Z,A,並且如果他們然後選擇織物Y,它們僅限於B,C或D等。 – mallan1121

+0

@ mallan1121是的,那正是我的意思。 – user6776148

回答

0

像這樣的東西應該夠了,你並不需要一個以上的表:

create table dbo.UserChoice 
(
    Id int identity(1, 1) primary key nonclustered, 

    UserId int not null, 

    StyleId int not null, 
    FabricId int not null, 
    BodyId int not null, 
    ColorId int not null, 
    ..., 

    constraint FK_UserChoice_UserId foreign Key (UserId) references dbo.User (Id), 

    constraint FK_UserChoice_StyleId foreign Key (StyleId) references dbo.Style (Id), 
    constraint FK_UserChoice_FabricId foreign Key (FabricId) references dbo.Fabric (Id), 
    constraint FK_UserChoice_BodyId foreign Key (BodyId) references dbo.Body (Id), 
    constraint FK_UserChoice_ColorId foreign Key (ColorId) references dbo.Color (Id), 
    ... 
) 
0

因此,我建議你有這樣的結構:

CREATE TABLE Choosable 
(
    ChoosableId int,   -- This is PK 
    Name  varchar(10), -- This can have values 'Style', 'Fabric', 'Body', 'Color' 
) 

Data in this table 

Style1 
Style2 
Fab1 
Fab2 
Fab3 
Body1 
Body2 
Blue 
Red 
Gray 


CREATE TABLE Choices 
(
    ChoiceId  int,  -- This is PK 
    ChoosableId int,  -- This is FK to Choosable.ChoosableId 
    ParentId  int  -- This is FK to ChoiceId 
) 

Structure for this table can support below data 

Style1 
    Fab1 
     Body1 
      Red 
      Blue 
     Body2 
      Red 
    Fab2 
     Body1 
      Blue 
      Gray 
      Red