Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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 如何最好地规范和参考(FK)位置(邻里/城市/地区/国家/大陆)_Sql_Database Design_Foreign Keys_Relational Database_Normalization - Fatal编程技术网

Sql 如何最好地规范和参考(FK)位置(邻里/城市/地区/国家/大陆)

Sql 如何最好地规范和参考(FK)位置(邻里/城市/地区/国家/大陆),sql,database-design,foreign-keys,relational-database,normalization,Sql,Database Design,Foreign Keys,Relational Database,Normalization,所以我四处寻找,但没有找到满意的答案 我有不同类型的位置,如标题所述。给定一种位置类型(即城市),可以推断出粒度较小的位置。也就是说,如果你知道你在俄勒冈州,这意味着你在美国,这意味着你在北美 我们有引用位置的对象,但粒度不尽相同。有些项目可能指向社区,其他项目仅在城市层面上已知,而有些项目仅在某个地区已知,等等 我有两种方式来组织数据,这是我倾向的方式: 有一个通用的“位置”表,其中位置“类型”和“父位置”引用自身。所以有一个条目是美国类型的country,还有一个条目是俄勒冈州类型的sta

所以我四处寻找,但没有找到满意的答案

我有不同类型的位置,如标题所述。给定一种位置类型(即城市),可以推断出粒度较小的位置。也就是说,如果你知道你在俄勒冈州,这意味着你在美国,这意味着你在北美

我们有引用位置的对象,但粒度不尽相同。有些项目可能指向社区,其他项目仅在城市层面上已知,而有些项目仅在某个地区已知,等等

我有两种方式来组织数据,这是我倾向的方式:

  • 有一个通用的“位置”表,其中位置“类型”和“父位置”引用自身。所以有一个条目是美国类型的country,还有一个条目是俄勒冈州类型的state,它引用了美国。 i、 e

然后,可以让对象参照其主键以外的位置,然后可以推断其他位置。这有意义吗?还是有更好的方法来组织数据

  • 我考虑的另一种方法是为每个位置“类型”使用不同的表,但问题是让我们的对象引用它,因为对象最细粒度的位置类型并不总是相同的
如果我以后再插入其他位置类型,例如城市和地区之间的县,这是否会带来问题?我认为这和使用单独的表没有什么问题,但也许有更好的方法可以让我以逻辑的方式跟踪事情。

关于:

国家:

  • Id
  • 名称
地区:

  • Id
  • CityId
  • 名称
城市:

  • Id
  • RegionId
  • 名称
社区:

  • Id
  • CityId
  • 名称
这适用于位置类型。但你的问题是

但粒度并不完全相同

为此:

对象:

  • Id
  • 名称
  • LocationId
  • 类型
    • 问得好

      你绝对应该选择你的第一个选择。如果你看任何一本数据建模模式的书,他们都会选择这种方式

      这仅仅是北美,还是全球

      问题:

      城市/城镇/村庄/村庄是分区的孩子(州/省的通用术语),但不是在英格兰,在那里他们是国家的孩子(或者是县的孩子)

      邮政区域(邮政编码、邮政编码)也是分区的子分区,而不是县或市。有些城市完全居住在拉链里,有些拉链完全居住在城市里

      县也是分裂的产物。曼哈顿包含县,而大多数县包含城市


      如果您希望找到一个全球性的解决方案,我会阅读Hay的企业模型模式。它在safari上廉价出售。

      这是一个子类的例子,通常称为子类型。有些子类型包含在其他子类型中,这一事实使情况变得复杂。经典的基本关系数据库设计很好地处理了容器问题

      子类问题需要一点解释。OOP所称的“子类”在ER建模界被称为“ER专门化”。这会告诉您如何绘制子类,但不会告诉您如何实现它们

      值得一提的是在SQL表中实现子类的两种技术。第一个名称是“单表继承”。第二个名称是“类表继承”。在类表继承中,您将有一个用于“位置”的通用表,其中包含所有位置共有的所有属性,而不管类型如何。在“城市”表中,您将拥有与城市相关的属性,但不涉及国家/地区等。您将拥有其他类型位置的其他子类表

      如果你走这条路,你应该寻找另一种技术,叫做“共享优先密钥”。在这种技术中,子类表的id字段都包含来自超类表的id字段的副本。这需要一点努力,但很值得

      共享主键有几个优点。它强制子类关系的一对一性质。它使将专用数据与通用数据连接起来变得简单、容易和快速。它跟踪哪些项属于哪个子类,没有额外的字段

      就你而言,还有另一个优势。通过使用外键引用位置的其他表不必决定是引用超类表还是子类表。引用超类表的单个外键也将隐式引用其中一个子类表,尽管不清楚是哪一个子类表

      这并不完美,但非常非常好。我去过那里,做过那件事


      有关更多信息,您可以通过谷歌搜索技术,或在SO中找到相关标签。

      Global。目前,我们将邮政编码作为一个独立的实体与地点联系在一起,由于您所说的,邮政编码与地点之间存在着多对多的关系。诚然,如果一个国家对一个地区没有相同的概念,那么一个城市不一定居住在一个“地区”中。在这种情况下,我计划如何组织它,要么国家可以有一个“虚拟”区域,要么这些城市的父位置可以是国家本身。因此,使用带有共享主键的子类表听起来像是我想要的方式。虽然我在P中尝试了这一点