2011-05-23 59 views
2

假設我有以下表格:「用戶」,「計算機」和「命令」。用戶和計算機可能有0或1個與它們相關的命令。一個命令總是由這兩個中的一個(並且只有一個)擁有。我怎樣才能建模?數據建模問題:由兩個不相關的表擁有的弱實體

我想的是這樣的:

user(id, command_id?, other1) 
computer(id, command_id?, other2) 
command(id, other3) 

這保證了用戶/計算機可具有0或1的命令,但允許命令以有一個以上的所有者。

但由於命令是一個弱實體(我想,如果我錯了,請糾正我),它應該引用它的所有者在一個外鍵。這導致以下結構:

user(id, other1) 
computer(id, other2) 
command(id, owner_id, owner_type(user|computer), other3) 

但是,這允許用戶或計算機擁有多個命令。它也不像第一個選項那麼好。

建議?

回答

0

我不認爲有一個好的方法來做到這一點與標準的SQL。可能有一個DBMS在那裏提供了一個很好的解決方案,我只是不知道。

我已經看到過去使用過的兩種解決方案。我真的不喜歡第二種解決方案,因爲您無法使用真正的FK關係。當您定義FK約束時,必須指定該表。但是,該表由owner_type列中的內容決定。另外,如果定義了第三個所有者類型,則必須引入另一個字符串來表示您的模型。這開始變得混亂。

我更喜歡第一個解決方案,但在命令表上有一個is_owned布爾列。該字段告訴我,如果某人已經擁有該命令。缺點是我不知道誰只是通過查看命令記錄來擁有命令。好處是我可以定義一個真正的FK約束,如果我有第三個+ owner_type,我可以簡單地添加附加表而不對現有模型進行任何更改。

0

這聽起來像域的command是一組是userscomputers工會。你可以添加一個代表該組人造實體,如command_owner

user(id, other1) 
computer(id, other2) 
command(id, other3) 
command_owner(id, user_id, computer_id, command_id) 

你需要在command_iduser_idcomputer_id在此表中唯一性約束。但是這引入了一個新的邊緣案例,其中一行可能得到computer_iduser_id指定的,我認爲你的模型不允許。您需要某種不符合規則的規則來執行此操作,例如觸發器或程序化約束。

1

您可以使用專業化。

User(id,other1) 
Computer(id,other2) 
Command(id,other3) 

User_cmd(user_id,cmd_id) 
Comp_cmd(comp_id,cmd_id) 
相關問題