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

时间:2008-09-08 17:36:36

标签: sql database-design

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

区域设置(ID,LocationName,ParentID),其中自治位置(例如国家/地区,例如美国)是其自身的父母。通过这种方式,我可以对“政治单位”(COUNTRY> STATE> CITY或COUNTRY> STATE> CITY> UNIVERSITY)进行任意深度嵌套。有些查询必然会涉及递归。

对于我可能会遇到的可预测问题的任何其他建议或建议,我将不胜感激。

8 个答案:

答案 0 :(得分:5)

听起来对我很好。在阅读帖子时我不清楚的一件事是“父母自己”的意思 - 如果这表明语言环境没有父母,那么你最好使用null而不是自己的ID。

答案 1 :(得分:5)

您可能希望将Freebase.com视为一个网站,该网站对“位置”的含义以及位置包含在另一个位置时的含义进行了一些公开讨论。这些问题可以产生很多讨论。

例如,有明显的“地理嵌套”,但逻辑嵌套不太明显。例如,在严格的地理意义上,梵蒂冈城嵌套在意大利境内。但它并没有在政治上嵌套。同样,如果您的用户位于属于大学的研究中心,但不在大学的财产中,那么您是否建立了这种关系的模型?

答案 2 :(得分:4)

我认为你可能会过度思考这一点。大多数系统只存储地址和国家表格是有原因的。以下是一些需要注意的事项:

  1. 布朗克斯的地址是否会将自治市镇作为层级中的一个级别?非法人区域的地址是否会消除层级的“城市”级别?你如何模拟大学内的地址与不在一个地址内的地址?你最终会得到一个粗糙的层次结构,每次你需要在你的应用程序中显示一个地址时,它会强制你遍历树。如果您有“地址簿”页面,则性能影响可能很大。

  2. 我不确定你是否只有一个层次结构。布朗大学位于罗德岛州普罗维登斯和罗德岛州布里斯托尔。唯一干净的解决方案是拥有一个带有两个校园的双层次结构,每个校区属于一个层次结构中各自的城市,但两者都属于另一个层次结构中的布朗大学。 (一所大学基本上不同于一个政治区域。你不应该把它们混合起来。)

  3. 邮政编码怎么样?一些邮政编码包含多个城镇,有时城市被分成多个邮政编码。并且(很少)一些邮政编码甚至跨州线。 (根据维基百科,至少......)

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

  5. 听起来您正试图在应用程序中模拟整个世界。您是否真的想要或需要维护一个可以想象包含世界上每个城市,州,省,邮政编码和国家/地区的表格? (或者至少每一个你认识某人的人?)我唯一能想到的是这个方案会给你带来的是接近,但如果这就是你想要的东西我只是分别存储州和国家(也许是邮政编码)并添加Google的纬度和经度数据。

  6. 抱歉极度悲观,但我自己走了这条路。它在逻辑上美观而优雅,但在实践中效果不佳。

答案 3 :(得分:3)

这是一个非常灵活的架构的建议。立即警告:对于您实际需要的内容,它可能过于灵活/复杂

地点 (LocationID,LocationName) - 基本构建块

LocationGroup (LocationGroupID,LocationGroupName,ParentLocationGroupID) - 这可以有效地封装多个层次结构。您有一个根节点,然后您可以创建多个独立分支。例如。您可以先按州拆分,然后创建多个子层次结构,例如ZIP /城市/ XXXX

LocationGroupLocation (LocationID,LocationGroupID) - 以下是将位置与一个或多个层次结构相关联的方法。例如。你可以把你的房子链接到一个ZIP,以及一个城市...你需要实现的是一个约束,你不应该将一个位置与任何两个层次结构连接起来,其中一个是另一个的父节点(因为这种关系已经隐含了)。

答案 4 :(得分:2)

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

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

答案 5 :(得分:1)

我同意其他帖子,你需要在这里非常小心你的要求。位置可能成为一个棘手的问题,这就是GIS系统如此复杂的原因。

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

  • 我支持之前的评论,即根级别的项目不应该将自己作为父级。根级别项目应具有父级的空值。始终要小心将数据放入没有意义的字段(即“特殊”值表示无数据)。这种做法很少必然且在方式过度使用。
  • 考虑XPath / XML。这是为了记录层次结构以及在检索时处理/解析数据而需要考虑的事项。如果您使用的是MSSQL Server,那么select语句中的XPath表达式非常适合于返回记录的完整位置/层次路径等任务,因为代码很简单且结果很快。

答案 6 :(得分:1)

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

如果你真的想要对它进行建模,也许你需要更通用的类型......国家 - >州 - >县 - >自治市镇 - >地点 - >城市 - >郊区 - >街道或邮政信箱 - >数字 - > - >公寓等 - >机构(大学或雇主) - >分部 - >细分-1 - > subdivision-n ...你确定你不能做KISS吗?

答案 7 :(得分:0)

我正在为全球用户建模应用程序并且我遇到了同样的问题,但我认为这种方法已经在许多企业中使用。但为什么这个问题没有通用的解决方案呢?或者,这个问题是一个最好的解决方案,可以作为起点,或者世界上的任何人都需要在解决方案中思考,因为beginnig? 在IT部门,遗憾的是,无论何时,我们都会在很多地方做同样的事情。例如,谁没有生成多个用户,客户或产品的数据库?最糟糕的是,世界上所有的企业都做到了。我认为这可以为普遍问题提供普遍的解决方案。