问题描述
我正在开发一个表,该表将存储具有位置的对象。对象可以具有指定的州/地区(可选),并且它们始终具有指定的国家/地区。因此,简化的起点是:
现在,州(可以通过ISO代码唯一标识)和国家之间存在功能依赖关系,州决定了国家。这将建议我创建一个新表:State,它具有一个引用另一个表Country的Country_id。问题在于,在要放入数据库中的数据中,“状态”值可能会丢失,因此为NULL,因此我没有什么可放入中间表中。
在国家与国家之间的依存关系中是否存在NULL(由于缺少信息而导致)是否意味着无法在此处实现第三范式,并且我需要从对象表中分别引用州和国家(地区)表?或针对这种情况的最佳设计解决方案是什么?
编辑:这实际上是一个关于问题Functional dependencies in case of nulls的实际实现的问题,关于哪个设计解决方案将适用于id-state-country之间可能的传递函数依赖项可以包含状态的空值的情况
解决方法
我假设您的对象表包含州和国家/地区以外的其他信息,
您可以这样设计Object表:
Object
------
Object ID
State FK
Country FK
状态FK将为空。没有值表示没有状态。
您将有单独的State和Country表。这类表的另一个名称是 value表,因为SELECT WHERE ID =键返回一个值。
以下是“国家和地区”表。根据您的应用程序,确保州或地区位于该国家/地区。
Country
-------
Country ID
Country Name
State
-----
State ID
Country FK
State Name
,
这是一个相当棘手的问题。在实践中,通常可以通过使用单个地理表来解决这一问题,每行中都有不同的层次结构。
但是,这不是您的问题。您的问题是关于一个可选的中间尺寸。这确实给第三范式带来了问题。我认为规范的解决方案是引入伪造的“州”行,每个国家可能会有一个没有州的城市。
也就是说,层次结构固定为城市->州->国家。但是在某些情况下,“州”实际上是国家的代名词。