题
我有一个关于一个数据库,我设计并制作一个简单的问题肯定是归...
我有个客户表,与客户ID的主键。它有它反映了客户账户状态即代码的StatusCode列。 1 =打开,2 =封闭,3 =暂停等...
现在我想有另一场在客户表标志是否该帐户被允许悬挂或不...某些客户时,自动将他们打破那里的交易条款......别人不暂停...所以相关表中的字段将是像这样:
客户(客户ID(PK):的StatusCode:IsSuspensionAllowed)
现在这两个字段是依赖于主密钥作为不能确定或是否悬浮液上的特定客户允许除非你知道具体的顾客,当然除了的状态时IsSuspensionAllowed字段被设置为YES,则客户不应该具有3的StatusCode(暂停)。
看来,从上表的设计有可能要做到这一点,除非检查contraint添加到我的餐桌。我不能看到另一个表可如何被加入到关系设计为执行本虽然因为它是仅在IsSuspensionAllowed设置为YES及的StatusCode设置为3当两个具有在彼此的依存的情况
所以,我的长篇大论的解释后,我的问题是:这是一个正常化的问题,我没有看到一个关系设计,将强制执行这...或者是它实际上只是应该用支票来实施业务规则contraint并且该表实际上仍然归一化。
干杯,
史蒂夫
解决方案
是它是可能的。您可以使用检查约束和Case语句做到这一点:
Create Table Customer (
CustomerId <datatype> not null Primary Key
, StatusCode int not null
, IsSuspensionAllowed int not null Default( 1 )
, Constraint CK_Customer_IsSuspensionAllowed
Check ( IsSuspensionAllowed In(0,1) )
, Constraint CK_Customer_StatusCodeRange
Check ( StatusCode Between 0 And ?? )
, Constraint CK_Customer_StausCodeValid
Check ( Case
When StatusCode = 3 And IsSuspensionAllowed = 1 Then 0
Else 1
End = 1 )
, ....
)
您没有提到的PK的数据类型,所以我简单地插入的占位符。如果使用的是SQL Server,可以代替我上述int
和检查约束的使用位柱(bit
不是ANSI规范的一部分)。
这是哪里的东西代理键一样的状态码并不总是进行得很顺利,一个很好的例子。这将是更好的有字符串值表示在这种情况下,Case语句会读When StatusCode = 'Suspended' And IsSuspendedAllowed = 0...
的状态码。
从标准化的角度来看,我看不出有什么不妥。是否允许悬浮液是一种属性,具体到一个客户,而不是其他属性。你说的与检查约束什么,该属性值的某些国家不能存在这样很好。
顺便说一句,就不会更有意义说的状态“暂停”时,不允许IsSuspensionAllowed = 0?使用你的数据,不应该是不允许BE StatusCode = 3 and IsSuspensionAllowed = 0
状态?