2009-08-25 157 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 
} 

然而,我缺少的是知道根据特定的规则来创造什么行的一部分;这不包含在您的规则表中。