Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当城市/州不在';不知道_Sql_Database_Database Design_Foreign Keys - Fatal编程技术网

Sql 当城市/州不在';不知道

Sql 当城市/州不在';不知道,sql,database,database-design,foreign-keys,Sql,Database,Database Design,Foreign Keys,假设我有名为Customers、Countries、States和Cities的数据库表。单个客户将有一个CityID字段,该字段链接到Cities表。每个城市都有一个StateID字段,该字段链接到states表,其他国家也有类似字段 当我们知道客户的完整地址时,这是非常简单的,但有时我们只有他们的国家,有时只有国家。我们并不总是拥有这个城市 我们如何处理这件事?我们想拯救这个国家,但如果我们不了解这个城市,我们就做不到 我们可以将StateID和CountryID字段添加到customers

假设我有名为Customers、Countries、States和Cities的数据库表。单个客户将有一个CityID字段,该字段链接到Cities表。每个城市都有一个StateID字段,该字段链接到states表,其他国家也有类似字段

当我们知道客户的完整地址时,这是非常简单的,但有时我们只有他们的国家,有时只有国家。我们并不总是拥有这个城市

我们如何处理这件事?我们想拯救这个国家,但如果我们不了解这个城市,我们就做不到

我们可以将StateID和CountryID字段添加到customers表中,但这听起来像是糟糕的设计,可能会导致数据不一致

有什么建议吗?我相信这是一个相当标准的问题,但我找不到一个好的答案

另外,在回答Jaffar下面的评论时,这样做的原因是我们需要对我们的客户分布进行一些分析。该客户向医院集团销售价格昂贵的医疗扫描仪,并且并不总是知道订购扫描仪时哪个网站会使用。因此,我们需要能够指定尽可能多的信息,可能只是国家,可能是州,也可能是城市


我们目前只需要在美国这样做,但如果客户希望将分析扩展到其他国家,我们更愿意提供灵活的方法。

在城市表中,城市名称为空时,每个州一行;城市和州为空时,每个国家一行。当城市或州未知时使用它们。

我认为你的设计是错误的。你不应该为了得到一个州而需要一个CityID,或者为了得到一个国家而需要一个StatID

如果人们生活在一个不在城市的州的一部分呢?如果他们生活在一个不属于某个州的国家的一部分(或者在一个没有州的国家),该怎么办?如果他们住在一个城市国家,那里的城市、州和国家都是一样的呢

[UserID]
[Address Line 1]
[Address Line 2]
[Address Line 3]
[Address Line 4]
[CityID]
[StateID]
[CountryID]
[Zip Code]
把它们都做成外键

另外,如果你想尽可能地灵活,那么要求一个城市、州和国家肯定与此相反

这里有一篇关于这个主题的好文章:同样,有效的组合也存在

[编辑]
既然有那么多反对标准数据库设计的人

梵蒂冈城地址(无城市,无州)

地址:关岛硬石咖啡馆(无州)

表示这两个地址的唯一方法是使用三个非链接字段:

[城市][州][国家]


这是地址表的标准设计。

如果您查看任何数据模型模式手册,您会发现它们抽象了地缘政治区域

使用表继承

国家扩展了地缘政治区域,州/省、县、市(尽管不是邮政编码或大陆)也是如此

现在,您可以使用一列外键将客户指向任何地缘政治区域。如果你把它指向一个城市,你可以得到一个州,一个国家。如果你把它指向这个国家,那么至少你知道这个国家


这对于按县、州、国家跟踪税率也很有用

正如理查德建议的那样,我继续问,尽管我提出的问题略有不同。我提出了三种解决方案,三表方法(Richard喜欢),自引用位置表方法(我认为查询起来会很复杂)和Juhana使用三个表的方法,但包括一个空白条目(在我看来这是最简单的)

在那里的两个回复之后(如果你想完整地看到它们,请跟随链接),我尝试了自引用位置表的方法,发现它比我想象的要容易得多。它是所有方法中最灵活的,因为它允许我链接到任何级别的区域,包括尚未考虑的额外级别,不需要客户表中的多个链接,但不涉及复杂的查询

我不知道在纯SQL数据访问中使用这种方法是否容易,但当我使用ORM时,子位置被具体化为实体上的集合属性,使导航变得非常简单


感谢所有回复的人。我希望这对其他人有所帮助。

您能详细介绍一下您的计划吗?如果您需要它们,那么为什么不需要它们呢?如果它们是必需的,那么为什么会有这个问题呢?地址是一个政治问题。你不能指望政治上会有“好的设计”相关的东西:你可能会考虑邀请别人。他们是数据库设计方面的专家。如果你需要一个空城市和空州怎么办?@Richard“每个国家一行,城市和州都是空的”。你怎么能有一个空州却没有空城?@Juahana梵蒂冈城有一个城市,但没有州或国家。(或没有城市或州的国家)也是一个常见问题。关岛就是一个例子。我已经想到了这一点,这是一个我仍在考虑的方法。空行不会显示在GUI中,但可以用来保持良好的数据库结构,同时允许未知数据。我只是希望它们是另一种不需要处理占位符条目的方法。谢谢你的建议。@Richard我还是不明白问题所在;如果一个国家没有州,其所有州字段在任何情况下都为空。如果一个国家有州,没有州,城市本身就毫无意义(“美国斯普林菲尔德”),因此在这些国家它将是强制性的。请参阅myn更新的问题,了解我们正在尝试做什么。这不是要求CityID获取其他ID的情况,更重要的是,一旦有了CityID,就不需要其他任何东西,因此将所有三个ID添加到customers表是重复的,并且可能导致数据不一致。如果我们总是有国家、州和城市,那么我们只需要客户表中的城市ID
His Holiness Pope Francis
Apostolic Palace
Vatican City
Hard Rock Cafe Guam
1273 Pale San Vitores Road
Tamuning, Guam 96913