0

在地理编码时与 Google 的 TOC 一致,我想缓存结果以减少其服务器上的负载。我还想尽可能有效地存储地理编码结果,而不包括街道编号和街道名称。这是我将使用的示例地址:

275-291 Bedford Ave, 布鲁克林, 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 新手,所以从存储和回忆的角度来看,这种结构是否有意义?

4

1 回答 1

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".

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

于 2013-08-13T19:50:22.613 回答