我有这些 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 个连接关系确实需要不同的附加属性,您的答案会如何变化?期望某些字段可为空,而其他字段则不取决于类型?
不要尝试将两种关系放在同一个表中 - 您只会使应用程序逻辑复杂化(例如,您将需要编写更多代码)。
创建 PHOTO_ALBUM_REL 表(每个示例仅包含 1 条记录)
| PHOTO_ID | ALBUM_ID |
| 1 | 1 |
创建 PHOTO_COLLECTION_REL 表(每个示例仅包含 2 条记录)
| PHOTO_ID | COLLECTION_ID |
| 1 | 1 |
| 2 | 5 |
这消除了所有歧义和不必要的类型检查/比较。
您还问:“如果 2 个连接关系确实需要不同的附加属性,您的答案会如何变化?”。如果您认为会有基于类型的附加属性,那么拥有两个单独的表对我来说听起来更好,以避免您的下一个场景“期望某些字段可为空,而其他字段不依赖于类型?”
您似乎已经意识到,在同一个表中拥有两种关系将导致列中出现一堆空值。将它们分开可以给你一个非常干净的设计,没有歧义。从长远来看,它也将更容易维护。例如,假设您想向您的收藏功能添加一些新属性或功能 - 您可以在不触及与相册功能相关的任何内容的情况下执行此操作。
祝您的项目顺利!