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

6
我正在设计一个联系人管理系统,遇到了一个有趣的问题,关于以一致的方式对地理位置进行建模。我希望能够记录与特定人员相关的位置(工作、学校、家庭等的邮寄地址)。我的想法是创建一个如下所示的地点表: 地点(ID、地名、父级ID),其中自治地区(例如国家,如美国)是其自身的父级。这样,我可以任意深度嵌套“政治单位”(国家>州>城市或国家>州>城市>大学)。某些查询必然涉及递归。
我将感激任何其他建议或可能遇到的可预测问题的建议。
8个回答

5

听起来对我来说是一个不错的方法。当我阅读您的帖子时,唯一不清楚的是“parents of themselves”的含义 - 如果这是要表示该语言环境没有父级,则最好使用null而不是自身的ID。


1
在编程中,对于父级(根级)项目,您应该绝对使用空值而不是将它们设置为自己的父级。除非数据确实具有意义,否则请尽量避免输入数据。 - Dr8k

5
你可能想要查看Freebase.com,这个网站有一些关于“位置”意义的公开讨论,以及当一个位置包含在另一个位置时它的意义。这些问题可以引发很多讨论。
例如,有明显的“地理嵌套”,但还有不太明显的逻辑嵌套。例如,在严格的地理意义上,梵蒂冈城位于意大利之内。但政治上并非如此。同样,如果你的用户位于属于大学的研究中心,但不在大学的物业内,你是否对这种关系进行建模?

4
我认为你可能想得太多了。大多数系统只存储地址和可能的国家列表是有原因的。以下是需要注意的一些事项:
1. 布朗克斯的地址是否应该包含行政区作为层级?非法人地区的地址是否应该消除“城市”层级?如何建模大学内部的地址和不在大学内的地址?你最终会得到一个不规则的层次结构,每次需要在应用程序中显示地址时都需要遍历树形结构。如果你有一个“通讯录”页面,则性能影响可能会很大。
2. 我不确定你是否只有一个层次结构。布朗大学在罗德岛普罗维登斯和布里斯托尔都有设施。唯一的干净解决方案是使用双重层次结构,其中两个校园分别属于它们各自所在城市的一个层次结构,但在另一个层次结构中都属于布朗大学。(大学与政治区域根本不同。你不应该混淆它们。)
3. 那么邮政编码呢?有些邮政编码包含多个城镇,有时一个城市被分成多个邮政编码。而且(很少见)有些邮政编码甚至跨越州界。(至少根据维基百科是这样的......)
4. 你将如何输入数据?通过解析格式规范的地址来构建数据库可能会很困难,因为需要考虑到华丽的地址、某些街道的替代名称、不同的国际格式等。我认为逐个输入每个地址的层次结构会很麻烦。
5. 听起来你正在尝试在你的应用程序中模拟整个世界。你真的想要或需要维护一个表格,其中包含世界上每个城市、州、省、邮政编码和国家(或至少你认识的每个人所在的地方)吗?这种方案唯一可以带来的好处就是接近性,但如果这正是你想要的,我会只存储州和国家(也许还有邮政编码),并从谷歌添加纬度和经度数据。
抱歉这么悲观,但我自己也走过这条路。它在逻辑上美丽而优雅,但实际上效果并不好。

你好,我有一个类似的问题,我非常喜欢你所说的话。我想知道你是否能够看一下或者联系我,如果可能的话给我一些建议。我的昵称是gmail com。非常感谢。 - Kentor

3

以下是一个非常灵活的模式建议。但需要提醒的是,它可能对您实际需求来说过于灵活/复杂。

位置 (位置ID,位置名称) -- 基本构建块

位置组 (位置组ID,位置组名称,父位置组ID) -- 这可以有效地封装多个层次结构。您有一个根节点,然后可以创建多个独立的分支。例如,您可以首先按州划分,然后创建几个子层次结构,例如 ZIP /城市/xxxx

位置组位置 (位置ID,位置组ID) -- 这是如何将位置与一个或多个层次结构链接起来的。例如,您可以将您的房子链接到一个ZIP,以及一个城市... 您需要实现的约束是,您不应该能够将一个位置链接到任何两个层次结构中,其中一个是另一个的父级(因为关系已经是隐含的)。


2
我认为应该仔细考虑这个问题,因为它可能不是必要的功能。为什么不只使用一个文本字段,让用户输入地址呢?
要记住KISS原则(保持简单愚蠢)。

1

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

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

  • 我支持先前评论的观点,根级别项目不应将自己作为父级。根级别项目的父级应具有空值。在将数据放入没有意义的字段中时要格外小心(即“特殊”值以表示无数据)。这种做法很少必要,并且在开发人员社区中被过度使用。
  • 考虑 XPath / XML。这是一些记录层次结构和处理/解析检索数据的方法。如果您正在使用 MSSQL Server,则 select 语句中的 XPath 表达式非常适合任务,例如返回记录的完整位置/层次路径,因为代码简单,结果快速。

1

对于地理位置,您可能希望将地址解析为纬度、经度数组(也许使用 Google 地图等)以计算距离等。对于地缘政治嵌套...我会选择 KISS 方法。

如果您真的想建模,也许需要更通用的类型... 国家-> 州-> 县-> 区-> 地方-> 城市-> 郊区-> 街道或邮箱-> 号码-> -> 公寓等-> 机构(大学或雇主)-> 部门-> 子部门-1-> 分部-n ... 您确定不能采用KISS吗?


0

我正在为全球用户建模一个应用程序,我也遇到了相同的问题,但我认为这种方法可能已经在许多企业中使用。但为什么这个问题没有通用解决方案?或者,这个问题是否有一个最佳解决方案可以作为起点,任何人都需要从一开始就考虑解决方案?

在IT领域,我们不断地重复着同样的事情,而且发生在许多地方。例如,谁没有建立过一个以上的用户、客户或产品数据库?最糟糕的是,世界上所有的企业都做过这件事。我认为,对于普遍存在的问题,应该有普遍适用的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接