Database 数据库设计-可传递依赖
这里有一张这样的桌子: 这是一个简化的场景。假设一个客户是否有服务需求。在这个需求表中,isServiced是一个二进制值,如果为true,我们需要让客户从提供者公司表(查找表)中选择一个服务提供者公司。如果为false,这意味着客户不想要服务,所以只需将ServiceCompany保留为null即可 我的问题是这是否违反了第三范式。它是否存在可传递依赖性问题,即服务公司依赖于IServiced取决于需求id 如果它有问题,我如何解决它?该关系是第三范式,因为Database 数据库设计-可传递依赖,database,database-design,Database,Database Design,这里有一张这样的桌子: 这是一个简化的场景。假设一个客户是否有服务需求。在这个需求表中,isServiced是一个二进制值,如果为true,我们需要让客户从提供者公司表(查找表)中选择一个服务提供者公司。如果为false,这意味着客户不想要服务,所以只需将ServiceCompany保留为null即可 我的问题是这是否违反了第三范式。它是否存在可传递依赖性问题,即服务公司依赖于IServiced取决于需求id 如果它有问题,我如何解决它?该关系是第三范式,因为ServiceCompany\u
ServiceCompany\u id
的值不是由isServiced
唯一确定的
实际上,函数依赖关系是→ B表示如果两行或多行具有相同的A值,则它们必须具有相同的B值(但这里不是这种情况,因为当isServiced
为true时,ServiceCompany\u id
具有不同的值)
因此,您不需要修改关系。该关系为第三范式,因为ServiceCompany\u id
的值不是由isServiced
唯一确定的
实际上,函数依赖关系是→ B表示如果两行或多行具有相同的A值,则它们必须具有相同的B值(但这里不是这种情况,因为当isServiced
为true时,ServiceCompany\u id
具有不同的值)
因此,您不需要修改关系。IsService的值由ServiceCompanyId确定。如果ServiceCompanyId为NULL,则IsService为FALSE。如果ServiceCompanyId不为NULL,则isServiced为TRUE 这种依赖性与您在问题中提出的依赖性相反。但它仍然是一个可传递的依赖项
然而,在我所看到的所有偏离3NF的情况下,它们从未处理过对另一个值是否为NULL的依赖性。如果它按照我认为的方式工作,那么需求就不在3NF中。isServiced的值由ServiceCompanyId确定。如果ServiceCompanyId为NULL,则IsService为FALSE。如果ServiceCompanyId不为NULL,则isServiced为TRUE 这种依赖性与您在问题中提出的依赖性相反。但它仍然是一个可传递的依赖项
然而,在我所看到的所有偏离3NF的情况下,它们从未处理过对另一个值是否为NULL的依赖性。如果它以我认为的方式工作,那么需求就不在3NF中。如果NULL被认为是一个值,那么就有@WalterMitty指出的可传递依赖关系 但是,如果NULL不是值,则它是表示元数据的物理符号,在逻辑关系中没有业务,在这种情况下,表实际上表示两个基本关系:
(Requirement_id, FALSE)
(Requirement_id, TRUE, ServiceCompany_id)
我会说两者都在3NF中,尽管是常数,但对于表示不同关系的表,我会犹豫是否说相同
请注意,IsService是冗余的-它可以从ServiceCompany_id的值或缺少值中派生出来。因此,这就给我们留下了:
(Requirement_id)
(Requirement_id, ServiceCompany_id)
除非您有依赖于RealthEngID的其他数据,否则您只能考虑为需要服务的客户记录行,在这种情况下,您将安全地位于3NF区域。
< P>如果NULL被认为是一个值,那么就会有一个传递依赖关系,正如WalterMitty指出的那样。 但是,如果NULL不是值,则它是表示元数据的物理符号,在逻辑关系中没有业务,在这种情况下,表实际上表示两个基本关系:(Requirement_id, FALSE)
(Requirement_id, TRUE, ServiceCompany_id)
我会说两者都在3NF中,尽管是常数,但对于表示不同关系的表,我会犹豫是否说相同
请注意,IsService是冗余的-它可以从ServiceCompany_id的值或缺少值中派生出来。因此,这就给我们留下了:
(Requirement_id)
(Requirement_id, ServiceCompany_id)
除非您有依赖于RealthEngID的其他数据,否则您只能考虑为需要服务的客户记录行,在这种情况下,您将安全地位于3NF区域。
给定空值,它不是定义关系,因此不在1NF中。我们不应该修改数学定义以适应SQL的便利性。这并不意味着它将不起作用:)给定NULL,根据定义它不是关系,因此不在1NF中。我们不应该修改数学定义以适应SQL的便利性。这并不意味着它将不起作用:)响应良好。特别是,指出NULL是一个特性,但(经典地)不是一个值。另外,指出NULL是表的一个特性,而不是抽象关系的一个特性。回答得好。特别是,指出NULL是一个特性,但(经典地)不是一个值。另外,指出NULL是表的一个特性,而不是抽象关系的一个特性。实际上,为什么一个是服务的
指示符呢?如果客户需要一项服务,他们会选择一项并将其输入要求表中。。如果他们不想要服务,根本不要在需求
中输入任何内容。实际上,为什么要设置IServiced
指示器?如果客户需要一项服务,他们会选择一项并将其输入要求表中。。如果他们不想要服务,根本不要在要求中输入任何内容。