2009-08-25 154 views
0

我有一個SQL數據庫,我將通過一次構建的LINQ進行交互。 它有一個客戶誰擁有(忽略其他人)兩個fkID字段到兩個表。數據庫體系結構問題


國家

我所試圖做的是存儲 「規則」 表,其中發生以下情況:

if the Class is 'A' and the Country is 'USA' then 
    create rows 'RowsA' in table todo 

else if the class is 'A' and the country is not 'USA' then 
    create rows 'RowsB' in table todo 

else 
    create rows 'RowsC' in table todo 



那麼,是最好的方式做到這一點在規則表中有

RuleID身份
ClassFK詮釋 空
CountryFK詮釋空
爲了 INT NOT NULL


,並有我的C#代碼執行以下操作:

var rules = from r in db.Rules 
      orderby r.order 
      select r; 

foreach(rule in rules) 
{ 
    if (((client.ClassFK == rule.ClassFK) || (rule.ClassFK == null)) &&    
      ((client.CountryFK== rule.CountryFK) || (rule.CountryFK== null))) 
    { 
      // Create The Rows 
    } 
} 

這對我來說似乎非常脆弱

+1

如何使用TRIGGER?優點/缺點:對應用程序代碼不太透明。 – 2009-08-25 17:39:32

+1

我會建議不要使用觸發器。我認爲我沒有遇到過使用觸發器的正當理由,除非你想混淆下一個試圖調試你的代碼的程序員。 – Kelsey 2009-08-25 17:51:39

+1

Kelsey,如果你的開發人員知道他們在做什麼,那麼使用觸發器的很多好理由。複雜的數據完整性規則必須始終處於觸發之中。在應用程序中處理它們是因爲開發人員不理解數據庫開發最多是不負責任的(還有其他方式將數據存入數據庫,而不是應用程序!),最壞的情況是對公司的底線有害。數據完整性應該勝過開發者的無能。 – HLGEM 2009-08-25 20:27:18

回答

1

讓我們看起來更清晰一點的一種方法我認爲應該在Rule類上創建一個方法來檢查它是否適用於客戶端;這使你的代碼看起來是這樣的:

foreach(rule in rules.Where(r => r.AppliesTo(client))) 
{ 
    // Create the Rows 
} 

然而,我缺少的是知道根據特定的規則來創造什麼行的一部分;這不包含在您的規則表中。