没有表之间的循环引用:
User
------
userid NOT NULL
PRIMARY KEY (userid)
Picture
---------
pictureid NOT NULL
userid NOT NULL
PRIMARY KEY (pictureid)
UNIQUE KEY (userid, pictureid)
FOREIGN KEY (userid)
REFERENCES User(userid)
ProfilePicture
---------
userid NOT NULL
pictureid NOT NULL
PRIMARY KEY (userid)
FOREIGN KEY (userid, pictureid) --- if a user is allowed to use only a
REFERENCES Picture(userid, picture) --- picture of his own in his profile
FOREIGN KEY (pictureid) --- if a user is allowed to use any
REFERENCES Picture(picture) --- picture in his profile
这种设计和需求的唯一区别是,用户可能没有与他相关的资料图片。
随着表之间的循环引用:
User
------
userid NOT NULL
profilepictureid NULL --- Note the NULL here
PRIMARY KEY (userid)
FOREIGN KEY (userid, profilepictureid) --- if a user is allowed to use only a
REFERENCES Picture(userid, pictureid) --- picture of his own in his profile
FOREIGN KEY (profilepictureid) --- if a user is allowed to use any
REFERENCES Picture(pictureid) --- picture in his profile
Picture
---------
pictureid NOT NULL
userid NOT NULL
PRIMARY KEY (pictureid)
UNIQUE KEY (userid, pictureid)
FOREIGN KEY (userid)
REFERENCES User(userid)
的profilepictureid
可以设置为NOT NULL
但你必须要处理的鸡和蛋的问题,当你要插入到两个表。这可以通过使用延迟约束来解决 - 在某些DBMS中,如PostgreSQL和Oracle。
因此,用户可能会插入许多图片。一张图片由一个用户插入。用户(可能)有一个配置文件图片(或没有)。正确? –
我不会使用循环依赖,除非绝对没有其他方式来做到这一点。在25年以上的数据库工作中,我从未见过没有替代品的情况。大多数人不会考虑的一个问题是,循环依赖会破坏很多第三方工具,如CASE,图表和逆向工程工具。 –