基于位置的应用

时间:2009-09-20 18:33:41

标签: database-design location database

我正在构建一个应用程序,允许人们在城市的不同区域(大约10个城市)发布信息。你们知道任何有这种信息的现有(标准化)数据库/数据集吗?或者我需要从头开始创建一个?任何指针建议非常感谢!

2 个答案:

答案 0 :(得分:2)

在这种情况下的规范化有些问题,因为原子性要求指定单个属性存储给定域的单个值,因此在查看坐标系时,这里变得相当模糊。有几个选择。其中每一个都完全正常化。

单独积分表

在这种方法中,你会有一个类似于(PostgreSQL表示法)的表:

 CREATE TABLE geo_points (
     id bigserial not null unique,
     x bigint,
     y bigint,
     z bigint,
     primary key (x, y, z)
 );

记录将进入此表,并且评论将加入geo_points.id。

点类型方法

各种数据库都有用于存储点的类型。如果我们假设一切都在地面,我们不需要跟踪高程,我们可以:

 CREATE TABLE tagged_location (
    id bigserial not null unique,
    user_id int references users(id),
    location point,
    comment text not null,
    primary key (user_id, location)
 );

使用此方法,点可能看起来像'(134.22222, 94.4444)',并且数据库管理系统可能支持不同的坐标系。这些可包括平坐标,球坐标等。选择坐标系非常重要,因为它会影响距离计算等单位。例如,如果使用球面坐标,则距离通常以度为单位,因此如果要转换为英里或公里,则需要额外的工作。

数字数组方法

您可以将点表示为数字数组。这通常是没有本机点类型的解决方法。这符合1NF,因为每个阵列代表单个位置的2d或3d坐标。普通性很重要,因此整个数组代表一个单一的值(即它是一个元组而不是一个集合或一个包)。这相当于使用点类型的上述方法,除了通常您必须进行自己的距离计算,该点看起来像'{134.22222, 94.4444}'

最终,有很多不同的方法都完全正常化,数据库设计的问题实际上受到RDBMS和用例的限制。您可能找不到完全适合您的用例的现成设计。

答案 1 :(得分:-3)

你可以把它保存为两个整数经度和纬度(我想,如果我的地理位置是正确的)