这里有一张这样的表:
这是一个简化的方案。假设一个客户有服务要求。在此需求表中,isServiced是二进制值,如果为真,我们需要让客户从提供商公司表(查找表)中选择一个服务提供商公司,如果它是假的,则意味着客户没有想拥有一个服务,所以只需将ServiceCompany保留为null即可。
我的问题是这是否违反了第3范式。是否存在传递依赖问题,服务公司依赖于服务取决于requirements_id。
如果有问题,我该如何解决?
答案 0 :(得分:3)
如果将NULL视为一个值,那么@WalterMitty指出了一个传递依赖。
但是,如果NULL不是值,则它是表示元数据的物理符号,并且在逻辑关系中没有业务,在这种情况下,表实际上表示两个基本关系:
(Requirement_id, FALSE)
(Requirement_id, TRUE, ServiceCompany_id)
我会说两者都在3NF,尽管如此,但是我会犹豫不决地说出代表不同关系的表格。
请注意,isServiced是多余的 - 它可以从ServiceCompany_id的值或缺少值派生。所以,这让我们:
(Requirement_id)
(Requirement_id, ServiceCompany_id)
除非您有其他数据依赖于Requirement_id,否则您可以考虑仅为需要服务的客户记录行,在这种情况下,您将安全地在3NF区域内。
答案 1 :(得分:1)
isServiced的值由ServiceCompanyId确定。如果ServiceCompanyId为NULL,则isServiced为FALSE。如果ServiceCompanyId不是NULL,则isServiced为TRUE。
此依赖关系是您在问题中提出的依赖关系。但它仍然是一种传递依赖。
然而,在我看到离开3NF的所有情况下,他们从未处理过对另一个值是否为NULL的依赖。如果它按照我认为的方式工作,则需求不在3NF中。
答案 2 :(得分:0)
第三范式中的关系是,因为ServiceCompany_id
的值不是由isServiced
唯一确定的。
实际上,函数依赖A→B意味着如果两行或多行具有相同的A值,则它们必须具有相同的B值(但这不是这里的情况,因为isServiced
时是的,你有ServiceCompany_id
}的不同值。
所以,你不需要修改关系。