【问题标题】:Uniquely identify images of multiple entity types from a single table - general design practices从单个表中唯一标识多个实体类型的图像 - 一般设计实践
【发布时间】: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

解决问题-

  1. 我考虑将Image 设为父实体-
Image
-----
id (PK)
base64

Movie
-----
id (PK)
title
image_id (FK to Image, Unique)

实体需要跟踪自己的 Image,并且现有 Image 实体中的架构没有变化,但是 -

  • ImageMovie(或其他实体)建立一对一关系的父母的想法在某种程度上感觉是错误的
  • 两种不同类型的实体现在可以引用相同的Image
  • 现在我正在丢失 Image 实体的级联删除
  1. 我考虑过使用像 MovieImage 这样的查找表 -
Movie
-----
id (PK)
title

Image
-----
id (PK)
base64

MovieImage
----------
movie_id (PK, FK to Movie)
image_id (FK to Image, Unique)

这样可以,但是-

  • Image 仍然可以被两种不同类型的实体引用
  • 它使应用程序级别的模型和数据操作有点复杂
  • 仍然失去级联

那么,最好的方法是什么?在这种情况下,一般的设计实践是什么?

【问题讨论】:

标签: database-design entity-relationship one-to-one


【解决方案1】:

在这种情况下,您可以使用变形关系。

图像架构

id | filename | imageable_type | imageable_id

现在您的imageable_type 将存储该图像所属的实体,imageable_id 将存储该实体的 id。

https://devdojo.com/tnylea/understanding-polymorphic-relationships

或者你可以做一些在这里详细解释的事情。

MySQL - Conditional Foreign Key Constraints

【讨论】:

  • 感谢您的回答。我期待一对一的关系。这会将Image 表中的任何外键标记为唯一。但是根据您的建议,imageable_id 必须是非唯一字段。
【解决方案2】:
  1. 您为每个实体<Entity>Image 创建一个表,即one-to-zero-to-one 与实体和one-to-one 与图像。这是可选的列方法,效果很好,但如果你没有点击,还有其他选项。
  2. 由于确实没有好的方法来确定数据库中的“重复”图像(除非这都是一个疯狂的比喻),而是在Image 和需要/将显示图像。如果没有图片,您可以只选择一张图片作为占位符。
  3. 第 2 项的推论 - 如果您有一个实体可能有也可能没有一张与之相关联的图像,或者 多个张与之相关联的图像,那么你会想要将它们建模为自己的表格。

【讨论】:

  • 如果我在 和 Image 之间建立一对多的关系(其中 是父级),那么我最终会在 Image 表中有多个外键列对于任何 Image 条目,只有其中一列将包含非 NULL 值。不是吗?
  • 不,Image 独立于其相关实体。如果您在实体和Image 之间建立一对多关系,则物理表示将是带有主键(<Entity's PK>,<Image's PK>) 的联结表<Entity>Image。无需创建从实体到 Image 的关系。
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2018-01-23
相关资源
最近更新 更多