使用一个共享的Join表来实现多个多对多关系

问题描述 投票:0回答:1

我有这些 SQL 模型:相册、集合和照片。相册和收藏集都与照片具有多对多和一对多的关系,并服务于不同的应用目的。为此使用 2 个连接表与只有 1 个如下所示的连接表有何优缺点:

选项 1:PhotoCollectable(相册和收藏合并在同一行):

照片_id 专辑_id 集合_id
1 1 100
2 5

选项 2:PhotoCollectable(相册和收藏单独行):

照片_id 专辑_id 集合_id 类型
1 100 c
1 1 a
2 5 c

假设连接表在建模中不应该有任何其他属性,这里推荐哪个选项(或者我仍然应该做单独的连接表)以及为什么(优点和缺点)?如果这 2 个连接关系确实需要不同的附加属性,您的答案会如何变化?期望某些字段可为空,而其他字段则不取决于类型?

sql database database-design data-modeling software-design
1个回答
0
投票

不要尝试将两种关系放在同一个表中 - 您只会使应用程序逻辑复杂化(例如,您将需要编写更多代码)。

创建 PHOTO_ALBUM_REL 表(每个示例仅包含 1 条记录)

| PHOTO_ID | ALBUM_ID |
| 1        |     1    |

创建 PHOTO_COLLECTION_REL 表(每个示例仅包含 2 条记录)

| PHOTO_ID | COLLECTION_ID |
| 1        | 1             |
| 2        | 5             |

这消除了所有歧义和不必要的类型检查/比较。

您还问:“如果 2 个连接关系确实需要不同的附加属性,您的答案会如何变化?”。如果您认为会有基于类型的附加属性,那么拥有两个单独的表对我来说听起来更好,以避免您的下一个场景“期望某些字段可为空,而其他字段不依赖于类型?”

您似乎已经意识到,在同一个表中拥有两种关系将导致列中出现一堆空值。将它们分开可以给你一个非常干净的设计,没有歧义。从长远来看,它也将更容易维护。例如,假设您想向您的收藏功能添加一些新属性或功能 - 您可以在不触及与相册功能相关的任何内容的情况下执行此操作。

祝您的项目顺利!

© www.soinside.com 2019 - 2024. All rights reserved.