带有外键约束的SQL模式设计

时间:2017-01-05 12:49:08

标签: sql database postgresql database-schema multi-tenant

我正在设计一个用于多租户场景的数据库。 我最近了解到,为了强制tenant_ids在引用彼此的表之间是一致的,我需要让表的主键包括表id和ten​​ant_id。然后外键必须引用表id和ten​​ant_id。

这似乎按预期工作,但如果我的桌子没有引用租户怎么办?在下面的示例中,我有一个playlist_item,它不直接引用租户。我在这里看到的一个问题是,playlist_item可能会引用一段与其所属的播放列表没有相同租户的内容。

一个可能的解决方案是将tenant_id包含在数据库中存在的所有表中,以便能够始终引用租户,但这对我来说似乎有点麻烦,因为playlist_item(在这种情况下)已经有一个隐含的tenant_id通过它与播放列表的所有者关系。

我希望能够深入了解在这种情况下什么是一个好的解决方案,以及是否有任何其他方法可以实现相同的目标,而不存在数据不一致的潜在风险。

(这只是一个示例,而不是实际的数据库)

Sample schema design

1 个答案:

答案 0 :(得分:2)

这里有两个基本选项。

第一种是添加额外的外键和包含tenant_id的唯一约束,如果这样做,您可以确保全面引用相同的租户。如果要使用行级安全策略,请执行此操作,因为它将解决检查安全性时的一系列性能问题。

在这种情况下,播放列表在(id, tenant_id)上会有第二个唯一索引,而playlist_item会在(playlist_id, tenant_id)引用该外键。

您的第二个选择是将tenant_id放在可传递的位置。在这种情况下,您总是可以通过连接查找它,但是在使用行级安全性时这会表现不佳。