6

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

自治位置(例如国家,例如美国)是其父级的区域设置(ID、LocationName、ParentID) 。通过这种方式,我可以任意深度嵌套“政治单位”(国家 > 州 > 城市或国家 > 州 > 城市 > 大学)。一些查询必然涉及递归。

我将不胜感激任何其他建议,或者可能是关于我可能会在此类计划中遇到的可预测问题的建议。

4

8 回答 8

5

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

于 2008-09-08T17:39:47.047 回答
5

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

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

于 2008-09-08T17:47:05.063 回答
4

我想你可能想多了。大多数系统只存储地址或者国家表是有原因的。以下是一些需要注意的事项:

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

  2. 我不确定你甚至只有一个层次结构。布朗大学在罗德岛普罗维登斯和罗德岛布里斯托尔设有设施。唯一干净的解决方案是有两个校区的双重层次结构,每个校区在一个层次结构中属于各自的城市,但在另一个层次结构中都属于布朗大学。(一所大学从根本上不同于一个政治区域。你不应该把它们混为一谈。)

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

  4. 您将如何输入数据?当您考虑到虚地址、某些街道的备用名称、不同的国际格式等时,通过解析常规格式的地址来构建数据库可能很困难。而且我认为分层输入每个地址将是一个 PITA。

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

对不起,我太悲观了,但我自己也走上了这条路。它在逻辑上既美观又优雅,但在实践中效果不佳。

于 2008-09-08T19:03:03.647 回答
3

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

位置(LocationID,LocationName)——基本构建块

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

LocationGroupLocation (LocationID, LocationGroupID) -- 下面介绍如何将 Location 与一个或多个层次结构联系起来。例如,您可以将您的房子链接到 ZIP 以及城市......您需要实施的是一个约束,即您不应该能够将一个位置与任何两个层次结构链接起来,其中一个是其他(因为关系已经是隐含的)。

于 2008-09-30T05:00:44.233 回答
2

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

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

于 2008-09-08T21:05:58.127 回答
1

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

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

  • 我支持前面的评论,即根级项目不应该将自己作为父级。根级别项目的父项应该有一个空值。始终小心将数据放入没有意义的字段(即表示没有数据的“特殊”值)。这种做法很少在开发者社区被过度使用。
  • 考虑 XPath/XML。这是为了记录层次结构以及在检索时处理/解析数据而需要考虑的事情。如果您使用的是 MSSQL Server,则 select 语句中的 XPath 表达式非常适合诸如返回记录的完整位置/层次结构路径之类的任务,因为代码简单且结果快速。
于 2008-09-30T05:13:36.993 回答
1

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

如果您真的想对其进行建模,也许您需要更通用的类型... Country -> State -> County -> Borough -> Locality -> City -> Suburb -> Street or PO Box -> Number -> -> 公寓等 -> 机构(大学或雇主) -> 部门 -> Subdivision-1 -> subdivision-n ... 你确定不能做 KISS 吗?

于 2008-09-30T05:28:00.220 回答
0

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

于 2010-10-28T19:54:28.153 回答