好的,我有一张专辑和图片表。
相册可以有很多图像。
然而,图像可能并不总是属于相册。它可以是独立的。
更好的做法是在图像表的album_id上添加null,或者在album_id和image_id之间创建一个表。由于图像只能属于一个相册,我会在连接表中为image_id添加唯一的约束。
因此选项1)图像表中的空字段 选项2)在image_id上加入具有唯一约束的表
我已经读过这是识别或非识别关系。如果我有一个非识别关系,那么该字段仍然需要设置为null正确。换句话说,非标识关系需要设置为非强制性 - 空值正确吗?
答案 0 :(得分:2)
如果关系是一对多关系,NULL
上的images.album_id
更合适。在album_id
表上定义images
及其外键约束时,允许NULL
表示图像可能没有父相册。这种设计允许一对多的相册到图像,同时也允许孤立的图像。
CREATE TABLE albums (
album_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
othercol VARCHAR()
)
CREATE TABLE images (
image_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
album_id INT NULL,
FOREIGN KEY (album_id) REFERENCES albums (album_id)
)
如果图片需要属于多对多关系中的多个相册,则需要在其间使用表格来关联它们。当给定图像的album_images
中没有相关行时,这仍然允许孤立。
CREATE TABLE albums (
album_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
othercol VARCHAR()
)
CREATE TABLE images (
image_id INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
othercol VARCHAR()
)
/* Link albums to images as many times as necessary */
CREATE TABLE album_images (
album_id INT NOT NULL,
image_id INT NOT NULL,
FOREIGN KEY (album_id) REFERENCES albums (album_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (image_id) REFERENCES images (image_id) ON DELETE CASCADE ON UPDATE CASCADE,
/* composite key on the two, ensuring uniqueness */
PRIMARY KEY (album_id, image_id)
)
答案 1 :(得分:1)
这将允许您自己拥有图像
和专辑本身。
在适当的时候,您可以将它们关联在中间表中。多张专辑中的相同图像,同一专辑中的多张图像。
如果你这样做,你将永远不需要在以后更改你的表定义 - 即使你的业务规则发生了变化。