0

这是我用于存储位置的架构:

CREATE TABLE locality (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR (100) NOT NULL UNIQUE,
loc VARCHAR (17) NOT NULL,
rad VARCHAR (17)
);

CREATE TABLE administrative_area_level_1 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR (100) NOT NULL UNIQUE,
loc VARCHAR (17) NOT NULL,
rad VARCHAR (17)
);

CREATE TABLE administrative_area_level_2 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR (100) NOT NULL UNIQUE,
loc VARCHAR (17) NOT NULL,
rad VARCHAR (17)
);

CREATE TABLE administrative_area_level_3 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR (100) NOT NULL UNIQUE,
loc VARCHAR (17) NOT NULL,
rad VARCHAR (17)
);

CREATE TABLE country (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR (100) NOT NULL UNIQUE,
iso VARCHAR (3) NOT NULL UNIQUE,
loc VARCHAR (255) NOT NULL,
rad VARCHAR (255)
);

由于它们是一个层次结构,我想将它们链接在一起。例如:

USA ----> country(id=1) 
Washington ----> administrative_area_level3(id=54), country(id=1)

我的问题是,如果我尝试像这样菊花链表:

地点 -> 行政区域级别_1 -> 行政区域级别_2 -> 行政区域级别_3 等

然后在添加“USA”之前添加“Washington, USA”之类的条目将导致添加 USA。这是来自谷歌地理编码,但原始地理编码只会给我华盛顿的坐标值,而不是一般“美国”的坐标值。我需要为美国提出第二个地理编码请求并分别添加这些值。

据我所知,我唯一的选择是做这样的事情:

  • 看看华盛顿是否已经在桌子上
  • 地理编码华盛顿
  • 将结果添加到 Administrative_area_level2 和国家
  • 如果国家不存在,对国家进行地理编码并添加“loc”坐标

有没有更好或更聪明的方法来做到这一点?

4

1 回答 1

2

让我在前面说,如果您正在使用关系数据库中的层次结构,您真的想要这本书: http ://www.amazon.com/Hierarchies-Smarties-Edition-Kaufmann-Management/dp/0123877334

考虑到您的华盛顿问题,我想知道:您是否不满意,因为您的表格结构迫使您在您真正想要的是“华盛顿”时为“美国”添加一个条目?

我不是 100% 我可以回答你的问题,但让我告诉你我是如何处理这些类型的问题的。我几乎总是使用路径对关系数据库中的层次结构进行建模。而不是 5 个表,我将有一个称为“位置”的表,它看起来像这样:

create table locations (
    id varchar(10) not null primary key,
    path varchar(1000) not null unique,
    name varchar(40) not null,
    loc varchar(255) not null, -- from your model
    rad varchar(255) not null, -- from your model
);

“id”是每个位置的短标识符,“path”根据它的 id 和其他位置的 id 来描述这个位置在层次结构中的位置。

所以华盛顿看起来像这样:

id: wa
path: na/usa/wa
name: Washington

我们说华盛顿(“wa”)是美国(“usa”)的一部分,而美国(“usa”)又是北美(“na”)的一部分。

现在,您可以选择是否要实际包含“usa”和“na”的行。您不必为它们设置行来插入您的“wa”行。您可以立即插入行,或者从不插入它们(只需让您的代码了解“wa”可以是“usa”的一部分而没有完全定义“usa”),或者不立即插入它们并定期进行一些工作为出现在路径中但没有自己的行的任何位置运行并添加行。

我上面参考的 Hierarchies 书详细介绍了这种路径策略,并包含大量 SQL 代码,向您展示如何操作和浏览层次结构。

于 2013-08-13T22:39:28.030 回答