在关系数据库中建模地理位置

时间:2020-03-05 18:49:31  来源:igfitidea点击:

我正在设计一个联系人管理系统,并且遇到了一个有趣的问题,那就是以一致的方式对地理位置进行建模。我希望能够记录与特定人相关的位置(用于工作,学校,家庭等的邮寄地址)。我的想法是创建一个区域表,例如:

自治位置(例如美国等国家/地区)为其自身的父级的语言环境(ID,LocationName,ParentID)。这样,我可以任意深度地嵌套"政治单位"("国家/地区">"州">"城市"或者"国家/地区">"州">"城市">"大学")。一些查询将必然涉及递归。

对于采用这种方案可能遇到的可预见问题,我将不胜感激。

解决方案

回答

听起来对我来说是个好方法。在阅读文章时,我不清楚的一件事是"自己的父母"的意思是,如果这表示该语言环境没有父母,那么最好使用null而不是其自身的ID。

回答

我们可能想看看Freebase.com这个网站,它已经就"位置"的含义以及位置包含在另一个位置中的含义进行了公开讨论。这些问题可以引起很多讨论。

例如,存在明显的"地理嵌套",但是不那么明显的逻辑嵌套。例如,从严格的地理意义上讲,梵蒂冈城位于意大利境内。但这并不是政治上的嵌套。同样,如果用户位于一所大学的研究中心内,但又不在该大学的财产范围内,那么我们是否可以建立这种关系的模型?

回答

我认为我们可能对此想法有所怀疑。大多数系统都有一个原因,就是仅存储地址,可能还存储国家/地区表。以下是一些需要注意的事项:

  • 布朗克斯区中的地址是否会将自治市镇作为层次结构中的一个级别?非合并区域中的地址会消除层次结构的"城市"级别吗?如何对大学内的地址与不在大学内的地址进行建模?我们最终将得到一个参差不齐的层次结构,这将迫使我们每次需要在应用程序中显示地址时都要遍历树。如果我们有一个"通讯录"页面,那么对性能的影响可能很大。
  • 我不确定我们是否只有一个层次结构。布朗大学在罗得岛州普罗维登斯和罗得岛州布里斯托尔设有设施。唯一的干净解决方案是拥有一个双重层次结构,其中包含两个校园,每个校园在一个层次结构中分别属于各自的城市,但在另一个层次结构中均属于布朗大学。 (大学从根本上与政治地区不同。我们不应该将它们混为一谈。)
  • 邮政编码呢?一些邮政编码包含多个城镇,而另一些城市则分为多个邮政编码。并且(很少)一些邮政编码甚至跨越州际线。 (根据维基百科,至少...)
  • 我们将如何输入数据?当我们考虑虚荣地址,某些街道的备用名称,不同的国际格式等时,通过解析常规格式的地址来构建数据库可能很困难。我认为,分等级地输入每个地址都是PITA。
  • 听起来我们正在尝试在应用程序中为整个世界建模。我们是否真的想要或者需要维护一个可以想象包含世界上每个城市,州,省,邮政编码和国家的表格? (或者至少每个人都认识某个人?)我唯一能想到的是该方案可以为我们带来方便,但是如果我们要这样做,我将州和国家/地区(或者邮政编码)分别存储并添加来自Google的纬度和经度数据。

抱歉,我非常悲观,但我本人已经走了这条路。从逻辑上讲,它美观大方,但在实践中效果并不理想。

回答

我会仔细考虑一下,因为它可能不是必需的功能。
为什么不只使用文本字段并让用户输入地址呢?

记住KISS原则(保持简单,愚蠢)。

回答

这是一个非常灵活的架构的建议。立即警告:对于我们实际需要的可能太灵活/太复杂

地点
(LocationID,LocationName)
-基本构件

位置组
(LocationGroupID,LocationGroupName,ParentLocationGroupID)
-这可以有效地封装多个层次结构。我们有一个根节点,然后可以创建多个独立的分支。例如。我们可以先按州划分,然后创建几个子层次结构,例如邮编/城市/ xxxx

LocationGroupLocation
(LocationID,LocationGroupID)
-这是将位置与一个或者多个层次结构链接的方式。例如。我们可以将房屋链接到ZIP,也可以链接到城市...我们需要实现的约束是,我们不能将位置与任何两个层次结构链接在一起,而其中两个层次结构是另一个层次结构的父级(因为该关系已经是隐式的)。

回答

我同意其他职位,在这里我们需要特别注意自己的要求。位置可能会成为一个棘手的问题,这就是GIS系统如此复杂的原因。

如果我们确定只需要一个基本的层次结构,那么我有以下建议:

  • 我支持之前的评论,即根级项目不应该将自己作为父项。根级项目的父级应为空值。始终小心将数据放入没有意义的字段(即"特殊"值表示没有数据)。在开发者社区中,这种做法很少有必要被滥用。
  • 考虑XPath / XML。这是麻烦记录分层结构以及在检索时处理/解析数据的考虑因素。如果使用的是MSSQL Server,则select语句中的XPath表达式非常适合执行诸如返回记录的完整位置/层次结构路径之类的任务,因为代码简单且结果快速。

回答

对于地理位置,我们可能希望将地址解析为纬度,经度数组(可能使用Google地图等)以计算邻近度等。对于地缘嵌套,我会选择KISS响应。

如果我们真的想对其建模,则可能需要更通用的类型。 ->公寓等->机构(大学或者雇主)->部门->细分1->细分n ...我们确定不能做KISS吗?

回答

我正在为全球用户建模应用程序,但我也遇到了同样的问题,但是我认为这种方法可能已经在许多企业中使用。但是,为什么这个问题没有通用的解决方案?或者,这个问题是否是可以作为起点的最佳解决方案,或者自从开始以来世界上任何人都需要考虑解决方案?
不幸的是,在IT领域,我们随时随地都在做同样的事情。例如,谁创造了不止一个用户,客户或者产品的数据库?最糟糕的是,世界上所有企业都做到了。我认为这可以为普遍问题提供普遍解决方案。