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

Sql 关系数据库中的地理位置建模,sql,database-design,Sql,Database Design,我正在设计一个联系人管理系统,遇到了一个关于以一致的方式对地理位置进行建模的有趣问题。我希望能够记录与特定人员相关的位置(工作、学校、家庭等的邮寄地址)。我的想法是创建一个区域设置表,如下所示: 地区(ID、LocationName、ParentID)自治地区(如美国等国家)是其父母的地方。这样我就可以任意深入地嵌套“政治单位”(国家>州>城市或国家>州>城市>大学)。有些查询必然涉及递归 对于我可能遇到的与此类计划有关的可预测问题,我将非常感谢任何其他建议或建议。听起来对我来说是个不错的方法。

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

地区(ID、LocationName、ParentID)自治地区(如美国等国家)是其父母的地方。这样我就可以任意深入地嵌套“政治单位”(国家>州>城市或国家>州>城市>大学)。有些查询必然涉及递归


对于我可能遇到的与此类计划有关的可预测问题,我将非常感谢任何其他建议或建议。

听起来对我来说是个不错的方法。在阅读您的帖子时,我不清楚的一件事是“他们的父母”是什么意思——如果这是为了表示语言环境没有父母,那么最好使用null而不是自己的ID。

您可能想看看Freebase.com,它是一个关于什么是“位置”的公开讨论的网站以及当一个位置包含在另一个位置中时的含义。这类问题会引起很多讨论


例如,有明显的“地理嵌套”,但有不太明显的逻辑嵌套。例如,从严格的地理意义上讲,梵蒂冈城位于意大利境内。但它不是政治上的嵌套。类似地,如果您的用户位于一所大学的研究中心,但不位于该大学的财产上,您是否对这种关系进行建模?

我认为您可能想得太多了。这是一个原因,大多数系统只存储地址,也许还有一个国家表。以下是一些需要注意的事项:

  • 布朗克斯区的地址是否会将该自治区作为一个等级包括在等级中?在非法人区域的地址会消除等级的“城市”级别吗?你如何在一所大学内建立一个地址模型,而不是在一所大学内建立一个地址模型?您将得到一个参差不齐的层次结构,这将迫使您在每次需要在应用程序中显示地址时遍历树。如果你有一个“地址簿”页面,那么对性能的影响可能会很大

  • 我不确定你是否只有一个层次结构。布朗大学在国际扶轮的普罗维登斯和布里斯托尔都有设施。唯一干净的解决方案是建立一个双层次结构,其中两个校园在一个层次结构中分别属于各自的城市,但在另一个层次结构中都属于布朗大学。(大学从根本上不同于政治区域。你不应该将它们混为一谈。)

  • 邮政编码呢?一些邮政编码包含多个城镇,另一些时候一个城市被划分为多个邮政编码。而且(很少)一些邮政编码甚至跨越州际线。(根据维基百科,至少…)

  • 您将如何输入数据?考虑到虚名地址、某些街道的替代名称、不同的国际格式等因素,通过解析传统格式的地址来构建数据库可能会很困难。我认为按层次输入每个地址将是一个PITA

  • 听起来好像您正试图在应用程序中对整个世界进行建模。您真的想要或需要维护一个可以包含世界上每个城市、州、省、邮政编码和国家的表吗?(或者至少是你认识的每个人?)我能想到的唯一一件事就是这个方案能让你买的东西是接近度,但如果这是你想要的,我只需要分别存储州和国家(可能还有邮政编码),并从谷歌添加纬度和经度数据


  • 很抱歉我的极度悲观,但我自己也走了这条路。从逻辑上讲,它既漂亮又优雅,但在实际应用中效果不太好。

    我会仔细考虑这一点,因为它可能不是必需的功能。 为什么不使用文本字段,让用户键入地址


    记住(保持简单,愚蠢)

    这里有一个非常灵活的模式建议。一个直接的警告:它可能太灵活/复杂,无法满足您的实际需要

    位置 (LocationID、LocationName) --基本构造块

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

    位置组位置 (LocationID,LocationGroupID)
    --以下是如何将位置链接到一个或多个层次结构。例如,你可以将你的房子连接到一个拉链,也可以连接到一个城市。。。您需要实现的是一个约束,即您不能将一个位置与任何两个层次结构链接起来,其中一个层次结构是另一个层次结构的父级(因为关系已经是隐式的)

    我同意其他帖子的观点,在这里你需要非常谨慎地考虑你的要求。位置可能成为一个棘手的问题,这就是为什么GIS系统如此复杂

    如果你确定你只需要一个基本的继承权结构,我有以下建议:

    • 我支持前面的评论,即根级别的项不应将自己作为父级。根级别的项对于父级应具有空值。在将数据放入无意义的字段(即“特殊”值表示无数据)时,请务必小心。这种做法在devleoper社区中很少被必要和过度使用
    • 以XPath/XML为例。这是一个值得考虑的问题,麻烦记录的层次结构,并在检索过程中处理/解析数据。如果您正在使用