一对多可选关系Mysql- Null或表之间

时间:2012-08-19 13:31:27

标签: mysql

好的,我有一张专辑和图片表。

相册可以有很多图像。

然而,图像可能并不总是属于相册。它可以是独立的。

更好的做法是在图像表的album_id上添加null,或者在album_id和image_id之间创建一个表。由于图像只能属于一个相册,我会在连接表中为image_id添加唯一的约束。

因此选项1)图像表中的空字段 选项2)在image_id上​​加入具有唯一约束的表

我已经读过这是识别或非识别关系。如果我有一个非识别关系,那么该字段仍然需要设置为null正确。换句话说,非标识关系需要设置为非强制性 - 空值正确吗?

2 个答案:

答案 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)

个人 - 我会把桌子放在两者之间。

这将允许您自己拥有图像 和专辑本身。
在适当的时候,您可以将它们关联在中间表中。多张专辑中的相同图像,同一专辑中的多张图像。

如果你这样做,你将永远不需要在以后更改你的表定义 - 即使你的业务规则发生了变化。