这是多租户数据库中的设计决策。用“根”表,显然你有有user_id。但是在非“根”表中,当您使用代理PK时您有选择。
假设您有具有项目和项目的用户。项目显然必须有一个user_id,但是如果动作绑定到一个且只有一个项目,那么user_id是多余的,并且也违反了正常形式,因为如果要移动到另一个用户的项目(可能不太可能在您的用例中),项目FK和用户FK都必须更新。通常在多租户方案中,这并非真正可行的方案,因此每个表的主键实际上都是承租人和承租人“内部”的唯一主键(它们也可能是全球唯一的) 。
如果您在设计中广泛使用自然键,那么需要明确的租户+自然键,以便可以使用每个租户的自然键。只有在使用像IDENTITY或GUID或序列这样的替代品时,这会成为一个问题,因为它很容易使IDENTITY成为PK,毕竟它的定义是唯一的。
让user_id在所有表格中都允许您在视图中执行某些操作来增强安全性(纵深防御),为您提供一些防御性编程(在SQL Server中,您可以通过内联表值函数限制所有访问 - 基本上是参数化视图 - 要求应用程序在每个“表格”访问中指定user_id),并且还允许您通过将所有共享密钥上的所有内容叉开来轻松扩展到多个数据库。
请参阅this article了解一些有趣的见解。
(在大型多人并行模式像的Teradata,主索引确定在其上的数据的生活,所以我会认为这是必须的以停止行的重新分配到另一安培的安培。)
一般来说,我会说你在每个表中都有一个tenantid,它应该是表中的第一列,在大多数索引中应该是大多数情况下的主键的一部分,除非另有说明。在可能的情况下,它应该是大多数存储过程中必需的参数。
我的问题是,是否包含多个表格,而不仅仅是一个表格,我会编辑我的问题。 – Drarok 2010-03-26 00:12:13