Database 数据库设计-可传递依赖

Database 数据库设计-可传递依赖,database,database-design,Database,Database Design,这里有一张这样的桌子: 这是一个简化的场景。假设一个客户是否有服务需求。在这个需求表中,isServiced是一个二进制值,如果为true,我们需要让客户从提供者公司表(查找表)中选择一个服务提供者公司。如果为false,这意味着客户不想要服务,所以只需将ServiceCompany保留为null即可 我的问题是这是否违反了第三范式。它是否存在可传递依赖性问题,即服务公司依赖于IServiced取决于需求id 如果它有问题,我如何解决它?该关系是第三范式,因为ServiceCompany\u

这里有一张这样的桌子:

这是一个简化的场景。假设一个客户是否有服务需求。在这个需求表中,isServiced是一个二进制值,如果为true,我们需要让客户从提供者公司表(查找表)中选择一个服务提供者公司。如果为false,这意味着客户不想要服务,所以只需将ServiceCompany保留为null即可

我的问题是这是否违反了第三范式。它是否存在可传递依赖性问题,即服务公司依赖于IServiced取决于需求id

如果它有问题,我如何解决它?

该关系是第三范式,因为
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
指示器?如果客户需要一项服务,他们会选择一项并将其输入
要求
表中。。如果他们不想要服务,根本不要在
要求中输入任何内容。