我正在设计一个用于多租户场景的数据库。
我最近了解到,为了强制租户ID在相互引用的表之间保持一致,我需要表的主键同时包含表ID和租户ID。然后外键必须同时引用表ID和租户ID。
这似乎按预期工作,但如果我有没有引用租户的表呢?在下面的示例中,我有一个播放列表项,它没有直接引用租户。我在这里看到的一个问题是,playlist_项可能引用的内容与它所属的playlist不具有相同的租户。
一种可能的解决方案是将TANANTHOIDID包括在数据库中的所有表中,以便能够始终引用租户,但这对我来说似乎有点繁琐,因为PrasistListIn项目(在这种情况下)已经通过其与播放列表的所有者关系具有隐含的TANANTIGID。
我希望能深入了解在这种情况下什么是一个好的解决方案,以及是否有其他方法可以在不存在不一致数据的潜在风险的情况下实现相同的目标。
(这只是一个示例,不是实际的数据库)
最佳答案
你有两个基本的选择。
第一种方法是添加额外的外键和包含tenant_id
的唯一约束,如果这样做,可以确保全面引用同一个租户。如果要使用行级安全策略,请执行此操作,因为它将解决检查安全性时的一系列性能问题。
在这种情况下,playlist将在(id, tenant_id)
上有第二个唯一索引,playlist_item将在(playlist_id, tenant_id)
上有一个外键引用该索引。
您的第二个选择是将tenant_id
放到它被传递引用的位置。在这种情况下,您始终可以通过连接来查找它,但是当绑定到使用行级安全性时,这种方式的性能很差。
关于sql - 租户具有外键约束的SQL模式设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41485558/