这是我存储位置的模式:
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被添加。这是从谷歌地理代码,但原始地理代码将只给我华盛顿的坐标值,而不是“美国”一般。我需要为美国提出第二个地理编码请求,并分别添加这些值。你知道吗
在我看来,我唯一的选择就是这样做:
有更好或更聪明的方法吗?你知道吗
让我先说一下,如果您使用的是关系数据库中的层次结构,那么您真的想要这本书:http://www.amazon.com/Hierarchies-Smarties-Edition-Kaufmann-Management/dp/0123877334
想想你的华盛顿问题,我想知道:你不高兴是因为你的表结构迫使你添加一个条目“美国”,而你真正想要的是“华盛顿”你知道吗
我不是百分之百能回答你的问题,但让我告诉你我是如何处理这类问题的。我几乎总是使用路径为关系数据库中的层次结构建模。我没有5个表,而是有一个名为“locations”的表,看起来像这样:
“id”是每个位置的简短标识符,“path”根据其id和其他位置的id描述此位置在层次结构中的位置。你知道吗
所以华盛顿看起来是这样的:
我们说华盛顿(“wa”)是美国(“USA”)的一部分,而美国(“USA”)是北美(“na”)的一部分。你知道吗
现在,您可以选择是否实际包含“usa”和“na”的行。为了插入“wa”行,不必为它们设置行。可以立即插入行,也可以从不插入行(只需让代码理解“wa”可以是“usa”的一部分,而不完全定义“usa”),也可以不立即插入行,定期运行一些作业,并为路径中出现但没有自己行的任何位置添加行。你知道吗
我在上面引用的Hierarchies一书详细介绍了这个路径策略,并包含了大量的SQL代码,向您展示了如何操作和浏览层次结构。你知道吗
相关问题 更多 >
编程相关推荐