2012-02-01 27 views
1

我有以下型號(簡化使所有其他領域出,重點主鍵的ID):SQL模型/模式設計,檢查約束,FK或表重新設計?

[invoice] 
invoice_id 
customer_id 
invoice_description 

[customer] 
    customer_id 
    company_id 
    customer_name 

[company] 
company_id 
company_name 

[strategy] 
strategy_id 
strategy_descripton 

一個公司包含了許多客戶,這反過來又可以有屬於該客戶很多發票。

雖然上面沒有顯示,但我也希望列出屬於公司(只有一家公司)的戰略清單。

我希望客戶,發票和公司能夠定義一個引用他們所屬公司戰略的「默認策略」。

我知道我可以在每張表(發票,客戶和公司)中放置一個名爲strategy_id的額外FK字段,但我如何確保如果做出更改(有人試圖將策略轉移到另一家公司)最終沒有發票,還是客戶指向屬於另一家公司戰略清單的戰略?

我該如何處理這個問題 - 我是否需要檢查所有這些業務邏輯,或者使用檢查約束,還是可以通過重新設計表和外鍵來實現?

提前許多感謝,

克里斯

回答

0

你介意屬於公司客戶或發票改變他們的策略,如果公司改變他們的策略。

例如:如果company1有策略1。它有customer1,customer2(有發票1)。然後,如果company1將其發票更改爲strategy2,那麼customer1,customer2和invoice1屬於策略2或策略1是可以的。

如果沒關係做到:

  • 添加約束公司的表。檢查客戶/發票的策略找到母公司並檢查其策略。

否則,如果這非常重要:

  1. 添加約束公司表,不允許是否有屬於孩子的客戶/發票到公司(檢查是否存在的話)也被改變。
  2. 像上面提到的那樣爲每個表設置一個約束。

如果你想要一個更具體的答案,你將不得不澄清。

+0

感謝您的快速回復。 是的,如果有人在使用過程中嘗試將策略更改爲另一家公司,這一點很重要,這是不允許的。 如果你有任何鏈接的SQL約束條件/代碼實現上述,這將是偉大的,通常我已經做了這種檢查只在業務邏輯級別,但最近越來越擔心保護應用程序免受奇怪的狀態是'有效「,但在我的實體模型中無效。 您已通過上述方式回答了我的問題,謝謝。 – g18c 2012-02-01 21:38:23

+0

很高興我能夠幫助。如果您還有其他問題。 :) – Kyra 2012-02-01 21:39:52

+0

最後一個澄清/問題,是否也正確地檢查業務邏輯層中的這些約束(我正在使用EntityFramework與SQL後端),還是讓它爲數據庫處理?我想避免在許多不同的地方複製工作和實施規則。 – g18c 2012-02-01 21:47:02

0

如果我理解正確,你希望每個公司都有很多策略,每個策略屬於一個公司(所以公司和戰略之間的關係如此1:n)。而且每個公司的默認策略也是所有客戶及其發票的默認策略。

您可以通過增加一個表[company_default_strategy]這是與[strategy]1:1關係(有些策略是默認值)定義這些約束外鍵約束:

[invoice] 
invoice_id  PK 
customer_id FK to customer(customer_id) 
invoice_description 

[customer] 
customer_id PK 
company_id  FK to company(company_id) 
customer_name 

[company] 
company_id  PK 
company_name 

[strategy] 
strategy_id PK 
company_id  FK to company(company_id) 
strategy_descripton 

[company_default_strategy] 
company_id  PK, FK1 
strategy_id FK1 
    FK1 (strategy_id, company_id) to strategy(strategy_id, company_id)