2017-03-31 56 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