3

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

一个相册可以有许多图像。

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

更好的做法是在 image 表中的 album_id 上添加 null 还是在album_id 和 image_id 之间创建一个表。由于一张图片只能属于一个相册,我会在连接表中的 image_id 中添加一个独特的约束。

所以选项 1)图像表中的空字段选项 2)对 image_id 具有唯一约束的连接表

我读过这要么是识别关系,要么是非识别关系。如果我有非识别关系,则该字段仍需要设置为正确的空值。换句话说,非识别关系需要设置为非强制性的 - 是否正确?

4

2 回答 2

2

如果关系是一对多的,这里的 a NULLon theimages.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)
)
于 2012-08-19T13:35:39.080 回答
1

就个人而言 - 我会把桌子放在中间。

这将允许您自己拥有图像。
和自己的专辑。
并且在适当的时候,您可以将它们关联到中间的表格中。多个相册中的相同图像,同一个相册中的多个图像。

如果您采用这种方式,您以后将永远不需要更改您的表定义——即使您的业务规则发生了变化。

于 2012-08-19T13:43:59.610 回答