我有以下(简化)应用程序要求,我需要在SQL Server中创建数据库:
我使用以下表格对此进行了建模:
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中不存在。
这是一个好设计吗?我问,因为显然你可以在表C中插入一对(a,b),表A_B中不存在,后者负责将As与Bs相关联。
可以在C上创建一个触发器来执行上述检查,但此解决方案将处于实现级别。
另一种选择是在C中的(a,b)上创建一个复合FK。我之前从未使用过它们,所以我的问题再一次是否可以像这样继续进行。
感谢任何提示!
答案 0 :(得分:1)
是的,从C
到A_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_A
和FK_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