【发布时间】:2020-11-14 18:07:53
【问题描述】:
我有一个Movie 实体和一个Image 实体,其中Movie 应该有一个Image,我将它们放在一对一的关系中-
Movie
-----
id (PK)
title
Image
-----
id (PK)
base64
movie_id (FK to Movie, Unique)
我根据“Movie 可以在没有Image 的情况下存在,但Image 不能在没有Movie 的情况下存在”的逻辑将Movie 设为父实体 - 这确实是有道理的。但随后出现了导演、演员、用户等,每个人也需要有一个Image。
我希望 Image 可以通过任何其他实体唯一识别,即同一图像不应属于任何两个不同的实体(相似或不同类型)。如果我将Image 保留为其他实体的子实体,这很有可能。但是向Image 添加新的外键似乎是一个不好的方法-
- 这将需要在未来进行更多架构更改
- 只有一个外键字段将具有非 Null 值
此外,初始逻辑不再成立 - Image 现在可以在没有 Movie 的情况下存在,因为它可能是其他东西的 Image。
解决问题-
- 我考虑将
Image设为父实体-
Image
-----
id (PK)
base64
Movie
-----
id (PK)
title
image_id (FK to Image, Unique)
实体需要跟踪自己的 Image,并且现有 Image 实体中的架构没有变化,但是 -
-
Image与Movie(或其他实体)建立一对一关系的父母的想法在某种程度上感觉是错误的 - 两种不同类型的实体现在可以引用相同的
Image - 现在我正在丢失
Image实体的级联删除
- 我考虑过使用像
MovieImage这样的查找表 -
Movie
-----
id (PK)
title
Image
-----
id (PK)
base64
MovieImage
----------
movie_id (PK, FK to Movie)
image_id (FK to Image, Unique)
这样可以,但是-
-
Image仍然可以被两种不同类型的实体引用 - 它使应用程序级别的模型和数据操作有点复杂
- 仍然失去级联
那么,最好的方法是什么?在这种情况下,一般的设计实践是什么?
【问题讨论】:
-
“删除电影时,图像的级联删除丢失了。” Image 不再是 Movie 的孩子,所以这并不是真正的损失。您的选项 1 是更好的选择。
标签: database-design entity-relationship one-to-one