我正在构建一个应用程序,允许人们在城市的不同区域(大约10个城市)发布信息。你们知道任何有这种信息的现有(标准化)数据库/数据集吗?或者我需要从头开始创建一个?任何指针建议非常感谢!
答案 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)
你可以把它保存为两个整数经度和纬度(我想,如果我的地理位置是正确的)