4

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

4

2 回答 2

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 和您的用例的限制。您可能找不到完全适合您的用例的现成设计。

于 2013-03-22T01:23:09.210 回答
-3

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

于 2009-09-20T18:39:51.160 回答