我看到大多数人都讨厌在数据库设计中有循环依赖。由于在大多数数据库引擎中对此的支持是“棘手的”,我想知道这种设计是否有办法:
我有一张用户表和一张图片表
每张图片都有一个userId(插入它的用户) 每个用户都有个人资料图片
我可能只是创建一个ProfilePictures表,但它会在其他一些地方引起问题(比如图片评论)。
我知道还有其他一些与此问题相关的问题,但它们与父子关系更为相关,而这种情况并非如此。
那么,在这里使用循环依赖是否可以?如果没有,你会如何避免它?
答案 0 :(得分:8)
表之间没有循环引用:
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 - 使用延迟约束。
答案 1 :(得分:2)
如果每个用户只存储了几张图片,您可以在图片中留下一个标记,告知图片是否为个人资料图片。
答案 2 :(得分:0)
用户拥有UserID和ProfilePictureID
图片
具有PictureID,图片和用户ID
删除用户及其个人资料图片将/可以被PictureID删除,如果需要,还可以通过用户ID删除任何其他图片。
甚至不要考虑这个通告。