数据建模:地理位置层级

4
我希望我的用户能够指定他们的位置,以便我可以在地图上标记它们。给定一个地址,我使用Google Maps API获取他们的纬度/经度坐标并将其存储在数据库中。
此外,我想允许用户根据位置搜索其他用户。使用Google Maps API,我也可以获取地址(或纬度/经度坐标)的国家/州/城市。我的问题是,我不知道如何以这样一种方式存储国家/州/城市:
- 数据与特定用户相关 - 没有数据冗余
我的问题是如果用户1和用户2都输入了一个地址,导致国家是“美国”,那么我认为我需要知道用户1和用户2都来自于美国 - 而且“美国”只在数据库中存储一次。
当用户搜索其他用户时,如果我没有来自美国的用户,我应该只允许他们搜索美国以内的用户。也就是说,假设用户1和用户2是唯一两个来自美国的用户,如果用户1和用户2删除他们的个人资料,则不应再允许搜索美国内的用户。
我的想法是否概念上错误?无论如何,我应该如何建模这些信息?我正在使用MySQL。
1个回答

6
你的目标和意图是正确的(不要放弃!),你可能需要一些帮助才能达成目标。拥有更多关于数据建模和规范化的理解和经验会让事情变得更容易。因此,尽可能多地进行研究和练习(使用SO或网络并不是学习的好方法)。
为了加载和维护目的,最好确保您拥有标准化的地理位置自上而下的结构。您可以从您的市政府、县政府、邮局等提供的信息(通常是免费的)中加载它。这将消除外部参考表的手动数据输入。
这是一个高度规范化的数据模型,处于5NF。
但是还可以进行更多的规范化操作;还可以删除更多的重复内容。除非您真的感兴趣,例如需要搜索姓氏等,否则不值得这样做。
这个模型是为公用事业公司设计的,以确保潜在客户不会提供错误的街道位置。
地址是一个特定的房屋或单元(公寓),并且不重复。住在同一地址的两个人将使用一个地址行。
此结构处理“任何”地理位置。请注意,有些国家没有州;有些州没有县;有些城镇没有郊区等。我没有将所有这些例外情况都建立到数据模型中,而是保持了层次结构的“干净”。您仍然需要在SQL中处理它(无论模型是否简单且没有例外情况,因为这是现实世界),并且不要为没有州的国家显示州。您只需要为具有CHAR(0)状态代码的非州行添加一行以标识该条件。
我将经度和纬度放在了郊区级别,假设您的用户可以通过GoogleMaps轻松选择它,因为街道级别会有限制(可能太细粒度,会导致重复;或者对于非常长的街道城市来说不够细粒度)。很容易更改。
现在,我建议您不要担心识别同一国家的用户,先看看能否处理SQL以识别同一郊区的用户(而不是街道,那很容易)。之后,我们可以处理城市、县、国家等问题。
我认为您提到的其他搜索都很简单;看看您是否同意。

无论如何,这只是让你开始的一些东西;在最终确定之前还需要进行一些交互。

GLS数据模型链接(以及您其他问题的答案)

IDEF1X符号链接适用于那些不熟悉关系建模标准的人。


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