1

我的目标是将位置存储在表格中,但除了存储一个位置外,我还想将其链接到另一个位置。

示例:如果值为“Palm Beach”,我还想将其链接到“Florida”和“USA”以创建地址:

Palm Beach, Florida, USA

想法 1 一张桌子可以容纳一个国家、城市、城镇等,但要链接到“父母”。

CREATE TABLE location {
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
parentid          
FOREIGN KEY parentid REFERENCES Employee (EmployeeID),
name VARCHAR (100) NOT NULL UNIQUE,
loc VARCHAR (17) NOT NULL,
rad VARCHAR (17),
added DATETIME DEFAULT NOT NULL
};

想法 2: 相同的系统,但有不同的级别表

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),
added DATETIME DEFAULT NOT NULL,
FOREIGN KEY id REFERENCES administrative_area_level_1 (administrative_area_level_1),
};

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),
added DATETIME DEFAULT NOT NULL,
FOREIGN KEY id REFERENCES administrative_area_level_2 (administrative_area_level_2),

);

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),
added DATETIME DEFAULT NOT NULL
);

我真的希望能够从一个起点找出整个结构,例如搜索“棕榈滩”,我希望能够检索到它来自美国。

谁能给我一些关于最好的方法的意见吗?

编辑:我认为这是我想要使用的结构: https ://stackoverflow.com/a/317536/1738522

4

2 回答 2

1

对此的简短回答是,我已经使用嵌套集模型解决了这个确切的问题(按层次结构排列的地理区域)(更多信息可在http://mikehillyer.com/articles/managing-hierarchical-data-in- mysql/ )

更长的答案是,您不应该为每个级别创建单独的表,因为它不能轻松扩展到“n”级别,并且没有从级别 n 到级别 1 的简单路线。因此,想法 #1 是您的想法应追究和详述。

如果有疑问,请坐下来看看您复制了多少表结构。如果您完全复制了一个表结构,那么它们不应该(通常)是单独的表,因为重复表明您正在存储相同的数据。而是研究如何将其存储在单个表中。

在我的“地区”表中,我有以下列(除其他外)

  • 区域ID
  • 父区域ID
  • 区域名称
  • 左上角
  • rgt

regionIDparentRegionID容易填充。然后,我使用存储过程来生成lft和值,这些值在我链接的文章rgt中详述。

存储直接 parentID 的好处是您可以更轻松地操作树。您不需要这样做,并且可以轻松地存储lftrgt使用过程来添加/移动/删除树节点

lft/rgt 的使用允许轻松地遍历/检索父/子在树上下的过程,而无需 n 个连接。

于 2013-08-14T08:44:23.097 回答
0

很长一段时间以来,人们一直将地址存储在大型扁平表中,这是有充分理由的——它们处理起来非常混乱,而您所寻求的理论层次结构在现实世界的数据中是无法实现的。

例如,可能有一个城市“棕榈滩”,很容易与一个州联系起来,但有多少城市命名为“伦敦”、“牛津”、“斯普林菲尔德”等?很多,当然在不同的州。因此,知道一个城市被命名为“牛津”并不足以识别它——它只是在一个州的背景下是独一无二的。

邮政编码边界是另一个问题——并非所有五位数的邮政编码都完全位于一个州内——因此您不能将邮政编码定义为单个州的子代。

更不用说国际化问题了。

恐怕你正试图为已经解决的问题发明一种新的解决方案。

于 2013-08-14T09:16:51.327 回答