关系设计 - 一个“多对多”和两个“一对多”“两个表之间”

时间:2014-06-16 07:06:21

标签: sql-server relational

我有以下(简化)应用程序要求,我需要在SQL Server中创建数据库:

  • 实体A与实体B存在多对多的关系
  • 实体A与实体C的一对多关系
  • 实体B与实体C的关系也是一对多的。

我使用以下表格对此进行了建模:

A(PK)

B(b PK)

A_B(FK A(a),b FK B(b),PK(a,b))

C(c PK,a FK A(a),b FK B(b))

OB的。从(扩展)规范:A_B中的一对(a,b)在C中不存在。

  1. 这是一个好设计吗?我问,因为显然你可以在表C中插入一对(a,b),表A_B中不存在,后者负责将As与Bs相关联。

  2. 可以在C上创建一个触发器来执行上述检查,但此解决方案将处于实现级别。

  3. 另一种选择是在C中的(a,b)上创建一个复合FK。我之前从未使用过它们,所以我的问题再一次是否可以像这样继续进行。

  4. 感谢任何提示!

2 个答案:

答案 0 :(得分:1)

是的,从CA_B的外键会阻止C中显示的条目不会出现在A_B中。类似的东西:

 CREATE TABLE A (a char(3) not null, constraint PK_A PRIMARY KEY (a));

 CREATE TABLE B (b char(7) not null, constraint PK_B PRIMARY KEY (b));

 CREATE TABLE A_B(
    a char(3) not null,
    b char(7) not null,
    constraint PK_A_B PRIMARY KEY(a,b),
    constraint FK_A_B_A FOREIGN KEY (a) REFERENCES A(a),
    constraint FK_A_B_B FOREIGN KEY (b) REFERENCES B(b)
 );

 CREATE TABLE C (
    c char(19) not null,
    a char(3) not null,
    b char(7) not null,
    constraint PK_C PRIMARY KEY (c),
    constraint FK_C_A FOREIGN KEY (a) REFERENCES A(a),
    constraint FK_C_B FOREIGN KEY (b) REFERENCES B(b),
    constraint FK_C_A_B FOREIGN KEY (a,b) REFERENCES A_B(a,b)
 );

您是否继续FK_C_AFK_C_B取决于您。在上面的模型中,它们是多余的,但是如果a中的b和/或C可以为空,那么将它们分开来强制执行外来是有意义的当值不是全部非NULL时的键。

答案 1 :(得分:0)

只需在sql中使用join:

  select A.*, B.*, C1.*, C2.* from A 
    left outer join B on A.id=B.id
    left outer join C as C1 on A.id=C1.id
    left outer join C as C2 on B.id=C2.id
    -- Where condition as per requirement