2014-02-16 65 views
1

假設你有以下架構。數據建模,我應該使用多少個fk?

用戶有很多部門,(FK user_I'd)

各部門HV許多辦公室(FK department_I'd)

每個辦公室HV許多交易(遭遇S)(FK office_id)

現在的問題是,如果我想要獲得用戶的所有遇到的情況,我將需要搜索用戶的部門中的辦公室中的所有用例。

這是許多加入不ü認爲?

然而,如果我在遇到表中包含樹的所有外鍵?然後,我可以做select * from encounters where user_I'd = X

然而,這使我的表看起來醜陋,含有大量的父母我會重複的數據!

所以我的問題是,什麼是在這種情況下,最好的做法? 更多fk或更少並使用連接?

+0

什麼是你的商業模式遭遇?我認爲答案也可能取決於您需要多少次請求遇到用戶而不是遇到辦公室。如果你只關心用戶遇到的情況,那麼你應該改變你的模型,以減少對這個請求的連接。如果這是一個罕見的要求,那麼最慢的一個可以用於更自然的設計。 – Pierre

+0

丹ehr系統,遇到的是通常發生在辦公室內的病人 - 醫生互動 - 只有一次遭遇可以有許多醫生..我保持簡單,爲了例子 – Zalaboza

回答

0

當我設計我的表格時,我通常沒有任何冗餘,而是將多個連接的複雜性保留在服務器端代碼的服務層中。如果您想在之後更改設計,它可以提供更大的靈活性。

這可能是宗教,而不是純邏輯的問題,所以你可能需要排序決定的更多的答案。

+0

我喜歡那樣..但不知道如果我可以負擔得起這樣的靈活性對性能的影響,但我會記住:),謝謝 – Zalaboza

0

首先,這真的不是那麼糟糕的層次結構。如果您想要在所有與特定用戶關聯的場景中進行大量查詢,請創建視圖。這可能是這樣的:

create view Encounters as 
select 
    Transactions.Id as TransactionId, 
    Offices.Id as OfficeId, 
    Departments.Id as DepartmentId, 
    Users.Id as UserId 
    -- other fields 
from Transactions 
join Offices on Transactions.OfficeId = Offices.Id 
join Departments on Offices.DepartmentId = Departments.Id 
join Users on Departments.UserId = Users.Id 

這樣,您就可以執行任何ID字段的查詢,而不必重新每次連接,select * from Encounters where UserId = 12345

0

不會把三個不少自己。只有這樣才能知道非規範化遇到的好處是否超過了成本,是看看你是否遇到問題並通過非規範化來解決問題。我認爲現在做出這個決定還爲時過早。

相關問題