【问题标题】:One to Many optional relationship Mysql- Null or table betweenMysql-Null or table之间的一对多可选关系
【发布时间】:2012-08-19 13:31:26
【问题描述】:

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

一个相册可以有很多张图片。

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

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

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

我已经读到这是识别或非识别关系。如果我有非识别关系,则该字段仍需要设置为正确的空值。换句话说,非标识关系需要设置为非强制的 - 使用 null 是否正确?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果关系是一对多的,则images.album_id 上的NULL 在这里更合适。在images 表上定义album_id 及其外键约束时,允许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)
    )
    

    【讨论】:

    • 我认为这破坏了规范化?
    • 不,除非图像可以属于多个专辑,否则它不会破坏规范化,我没有从您的问题中得到。如果一个图像可以有多个父级(多对多),那么您需要一个表格。
    • stackoverflow.com/questions/1723808/… 说中间的表格是最佳实践。当然,这会更慢。
    • @MatthewChambers 虽然那里接受的答案主张中间表,但请注意,投票数多得多的答案主张可以为空的 FK。
    【解决方案2】:

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

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

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

    【讨论】:

    • 在 image 表上的 album_id 上添加 null 可以让他们独立,但仍然对吗?并且在查询选择权上会更快,但不确定这是否是最佳实践
    • 是的 - 具有空专辑 ID 的图像将是“独立的” - 但对我来说,如果您正在谈论不属于相册的图像,那么图像应该与相册完全分开用于标准化。
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 2016-09-23
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2022-01-05
    • 2014-06-27
    相关资源
    最近更新 更多