最有效的方法是从地理编码缓存主要位置

时间:2013-08-13 16:02:17

标签: mysql sql database postgresql

符合Googles TOC地理编码我希望缓存结果以减少服务器上的负载。我还希望尽可能有效地存储地理编码结果,而不包括街道号码和街道名称。以下是我将要使用的示例地址:

  

275-291 Bedford Ave,Brooklyn,NY 11211,USA

Types: street_number                    # 275-291
Types: route                            # Bedford Ave
Types: Administrative_area_level_3      # Brooklyn
Types: administrative_area_level_2      # Kings
Types: administrative_area_level_1      # New York
Types: Country                          # USA

如何建议我尽可能高效地完成这项工作。我想要有四个这样的表:

CREATE TABLE locality (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
loc varchar(255),
size varchar(255)
);

CREATE TABLE administrative_area_level_1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
loc varchar(255),
rad varchar(255)
);

CREATE TABLE administrative_area_level_2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
loc varchar(255),
rad varchar(255)
);

CREATE TABLE administrative_area_level_3 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
loc varchar(255),
rad varchar(255)
);

CREATE TABLE country (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
loc varchar(255),
rad varchar(255)
);

然后,当我尝试回忆它时,我会从最高级别(国家 - > Level3,Level2,Level1)查看是否可以找到它。这样我总能找到最重要的价值。

我是SQL的新手,所以从存储和重新收集的角度来看这个结构是否有意义?

1 个答案:

答案 0 :(得分:1)

使用外键将较低级别的值约束为较高级别的值

create table administrative_area_level_1 (
    id serial primary key,
    name varchar(255),
    loc varchar(255),
    rad varchar(255)
);

create table administrative_area_level_2 (
    id serial primary key,
    name varchar(255),
    loc varchar(255),
    rad varchar(255),
    level_1_id int references administrative_area_level_1 (id)
);

serial类型将创建一个整数序列。主键表示不为空。

references表示它必须存在于引用的表中。

insert into administrative_area_level_1 (name, loc, rad) values
('New York', 'some_loc', 'some_rad');

insert into administrative_area_level_2 (name, loc, rad, level_1_id) values
('Kings', 'some_loc', 'some_rad', 1);

现在,如果我尝试在引用表中插入一个在引用表中不存在的值,则会出现错误

insert into administrative_area_level_2 (name, loc, rad, level_1_id) values
('Kings', 'some_loc', 'some_rad', 2);
ERROR:  insert or update on table "administrative_area_level_2" violates foreign key constraint "administrative_area_level_2_level_1_id_fkey"
DETAIL:  Key (level_1_id)=(2) is not present in table "administrative_area_level_1".

在地址表中,您将引用您发布的所有五个表。