在层次结构中存储位置如何克服?

2024-03-28 13:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我存储位置的模式:

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)

我的问题是,如果我试着像这样用菊花链把桌子串起来:

locality -> administrative_area_level_1 -> administrative_area_level_2 -> administrative_area_level_3 etc

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

在我看来,我唯一的选择就是这样做:

  • 看看华盛顿是否已经在谈判桌上了
  • 华盛顿地理编码
  • 将结果添加到行政区域级别2和国家/地区
  • 如果国家不存在,则对国家进行地理编码并添加“loc”坐标

有更好或更聪明的方法吗?你知道吗


Tags: idautocreatetablenotarealevelnull
1条回答
网友
1楼 · 发布于 2024-03-28 13:23:07

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

想想你的华盛顿问题,我想知道:你不高兴是因为你的表结构迫使你添加一个条目“美国”,而你真正想要的是“华盛顿”你知道吗

我不是百分之百能回答你的问题,但让我告诉你我是如何处理这类问题的。我几乎总是使用路径为关系数据库中的层次结构建模。我没有5个表,而是有一个名为“locations”的表,看起来像这样:

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代码,向您展示了如何操作和浏览层次结构。你知道吗

相关问题 更多 >