如果数据库设计为:
Table A
a (type x)
a is (PK)
Table B
a (type x)
a is (PK)
Table C
a (type x)
a is (FK) references A(a)
a is (FK) references B(a)
这是正确的设计吗?如果没有,这个案例的最佳设计是什么?
答案 0 :(得分:1)
因此,当表B和A中存在相应的行时,您只希望能够在表C中插入行。这些行必须具有相同的id值。为什么不合并表A和B.分裂列过多的原因?要么这样做,要么删除表C中表B上的fk,并在表B中添加对表A的引用。虽然我不完全确定你想要用这个设计实现什么。
答案 1 :(得分:1)
我相信你所指的情况是C可能是A或B的孩子。
例如
如果A是页面
B是图片
和C是评论
C可以是对图片的评论或对页面的评论。
在这种情况下,我会将C调整为双键,如下所示
Table C:
a (type x)
b (type CHAR) //<- defines which table a is the key of
INDEX(b,a)
SQL = SELECT * from C where b = TABLE_A_name and C.a = A.a
or
SQL = SELECT * from C where b = TABLE_B_name AND C.a = B.a
然后,您必须从应用程序端获得数据完整性。
因此,它在外键实现和数据完整性方面是模糊设计。问题是应用程序功能是否值得混乱以及它是否处于良好管理的环境中。
答案 2 :(得分:-1)
这就是所谓的Star Schema Design,它是一组问题的正确设计。除非你定义你的问题,否则无法告诉你这个问题是否是一个好的设计。
答案 3 :(得分:-1)
看起来你有三元关系。不知道A,B和C是什么,不可能判断你是否有“正确”的设计。