0

ジオコーディング時の Google の TOC に沿って、サーバーの負荷を軽減するために結果をキャッシュしたいと考えています。また、通りの番号や通りの名前を含めずに、ジオコードの結果をできるだけ効率的に保存したいと考えています。以下は、私が使用するアドレスの例です。

275-291 Bedford Ave、ブルックリン、NY 11211、米国

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

これをできるだけ効率的に行うことをどのように推奨しますか。私はこのような4つのテーブルを持つことを考えていました:

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)
);

次に、それを思い出そうとすると、最上位レベル (国 -> レベル 3、レベル 2、レベル 1) から探して、それを見つけることができるかどうかを確認します。そうすれば、その値に一致する最も重要なエンティティを常に見つけることができます。

私は 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型は整数シーケンスを作成します。主キーは null でないことを意味します。

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

アドレス テーブルでは、投稿した 5 つのテーブルすべてを参照します。

于 2013-08-13T19:50:22.613 に答える