這是多租戶數據庫中的設計決策。用「根」表,顯然你有有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