2013-01-12 66 views
5

我們的系統中的進程負責根據特定規則發送文件。根據其文件名,文件可以發送給客戶或工廠(但從來都沒有)。設計只能擁有2個外鍵之一的數據庫實體?

規則的每一行都將包含文件名過濾器,它所屬的客戶和工廠,並指定其他參數,例如目標文件夾,文件是否需要加密,拆分,組合,重命名等。

在這個過程中,我們將知道一個文件屬於哪個工廠和客戶,我們將查看工廠和客戶的規則,並對與過濾器匹配的文件應用規則(將給予優先級根據客戶規則)

在數據庫中表示規則與客戶/工廠之間關係的最佳方式是什麼?我們已經在數據庫中有Customer和Factory表,但我想不出表示關係的最佳方式。規則的每一行都只有一個FK(客戶或工廠,它不能同時擁有,也不能擁有)。一來表示這種方式是這樣的:

enter image description here

但這並不捕獲的事實,它只能有恰好兩個FKS之一。我們可以設置一個約束條件,即其中一個必須是有效的FK,而另一個必須是空的,但它看起來不是很乾淨。此外,如果我們有其他規則的決定因素(例如國家),它會變得更加醜陋。任何想法如何改善這種設計?

我認爲這也有助於指定系統是在.NET中開發的,我們使用對象關係映射,即NHibernate。

+0

如果客戶和工廠之間存在一些共享數據,顯而易見的是引入客戶和工廠從中派生出來的基類。然後FK會去基類 –

回答

6

看看table inheritance

你可以使用這樣的事情:

Rule 
    int RuleId 
    int TypeRule 
    PK (RuleId) 
    UQ (RuleId, TypeRule) 

CustomerRule 
    int TypeRule = 1 
    int CustomerId 
    FK (TypeRule, RuleId) 
    FK CustomerId 

FactoryRule 
    int TypeRule = 2 
    int FactoryId 
    FK (TypeRule, RuleId) 
    FK FactoryId 

有了這樣你有一張顧客規則或工廠規則,而不是兩個系統。另外,明天添加CountryRule很容易。

+0

這是一個SQL服務器功能?任何想法如何與NHibernate的工作? –

1

關於引入什麼新的實體,而不是2 FK的?它將有3個領域,即它自己的PK和兩個FK。比你能夠介紹一些自定義邏輯,讓這些FK中的一個空着。從邏輯上講,您的任務只有一個FK,並且相應的實體負責處理細節。

1

我知道你提到了這個事實,即你不想爲此使用約束條件,但是讀取任何答案以及它們指向表繼承的方向的事實我想告訴我一點我的個人經驗。

數據庫並不是要複製面向對象的原理,我不確定NHibernate,但實體框架非常嚴格,因爲一旦實現了這種繼承,您可能會遇到這樣的事實,即您想要繼承幾種類型,這是不可能的(在EF中是一個事實)。我的意思是,你有一個規則可以被定義爲客戶規則和工廠規則(或者系統未來可能知道的任何其他類型的規則)。

我已經完成了表繼承和約束的實現,後者爲我提供了最靈活的模型,並且我仍然非常滿意這個解決方案。你最好用最簡單的方法考慮最簡單的方法,但有時候這只是一個事實,一個複雜的問題需要的解決方案不那麼簡單。

相關問題