2011-09-03 62 views
0

我有我的DB 2個表,我不能完全正確定義的關係:2 MySQL的外鍵在1tbl引用1主鍵

  1. tbl_users保存有關係統用戶和管理員的一些信息(I「打包」 2個不同的表 - tbl_users和tbl_admins - 在一起,因爲有屬性的約90%的重疊屬性之間主要區別是排序通過引入與布爾數據類型的屬性)*

  2. tbl_orders *持有一些信息關於用戶創建的訂單,並參考tbl_users,查看哪個用戶創建了哪個訂單。此外,此表應該對執行訂單處理的管理員提供參考。在管理信息存儲在tbl_users *

表說明:

**tbl_users** 
id int pk 
name varchar 
address varchar 

**tbl_admins** 
id int pk 
name varchar 
address varchar 

這兩個擠在一起看起來像這樣:

**tbl_users** 
id int pk 
name varchar 
address varchar 
user boolean 
admin boolean 

問題從這裏開始:

**tbl_orders** 
id int pk 
amount int 
processed boolean 
user_id - references tbl_users, but only the user that is user boolean=1 
admin_id - references tbl_users, but only the user that is admin boolean=1 

回答

0

另一種可能性:

名稱「組合的用戶」表中的「人」,持有任何用戶/管理員/不管,其他-用戶類型的信息了。

**tbl_persons** 
id int pk 
name varchar 
address varchar 

然後,還有一個表只存儲信息,一個人實際上是一個用戶(以及其他表適用於管理員):

**tbl_users** 
id int pk (NOT auto_incremented), fk references tbl_persons(id) 

**tbl_admins** 
id int pk (NOT auto_incremented), fk references tbl_persons(id) 

然後,很容易定義外鍵約束和強制你描述的完整性:

**tbl_orders** 
id int pk 
amount int 
processed boolean 
user_id fk references tbl_users(id) 
admin_id fk references tbl_admins(id) 
+0

非常感謝你們,夥計們! :)我會試一試! :) – omot

0

第二個外鍵可以是eas通過引用tbl_admins在數據庫上執行。只有用戶的外鍵才能在應用程序代碼上執行。

+0

或者你可以應用觸發器來檢查user_id是否真的是一個用戶。 –

+0

我沒有tbl_admins了。如果我決定在應用程序代碼上強制執行FK,它會是什麼樣子?一般的僞代碼是這樣的? 「如果tbl_users.ID = 7且tbl_users.admin = 1,則從tbl_users中選擇名稱,其中ID = 7」? – omot

+0

事情是,擁有處理訂單的admin_ID記錄會很棒。如果我只做了一個選擇---,那麼我沒有記錄,如果沒有管理員處理和清除訂單。 – omot

0

這可以通過創建兩個表來解決:

***tbl_user_order *** 
user_id --> foreign key: tbl_users.id 
order_id --> foreign key: tbl_orders.id 


*** tbl_admin_order *** 
user_id --> foreign key: tbl_users.id 
order_id --> foreign key: tbl_orders.id 

大公可能看起來是一樣的,但事實並非如此。第一個保存哪些用戶創建哪個訂單的數據,以及管理員通過訂單的第二個數據。

或者,您可以在兩個表彙總以上到一個表,說是這樣的:

***tbl_user_order *** 
user_id --> foreign key: tbl_users.id 
order_id --> foreign key: tbl_orders.id 
admin boolean 

在上表中,管理員布爾說,從tbl_user一個特定的用戶實際上是在其處理的管理該命令(對於admin = 1)。對於admin = 0,用戶標識表示創建訂單的用戶。

希望這會有所幫助。