在SQL中保存树数据

时间:2013-08-14 08:16:57

标签: mysql sql database

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

示例:值为“棕榈滩”我还想将其链接到“佛罗里达州”和“美国”以制作地址:

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

2 个答案:

答案 0 :(得分:1)

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

更长的答案是你不应该为每个级别创建一个单独的表,因为它不能轻易地扩展到“n”级别,并且没有从级别n到级别1的简单路由。出于这个原因,想法#1是你应该追求和阐述的那个。

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

在我的“地区”表格中,我有以下列(等等)

  • regionID
  • parentRegionID
  • regionName
  • LFT
  • RGT

regionIDparentRegionID足够容易填充。然后,我使用存储过程生成lftrgt值,这些值在我链接的article中详细使用。

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

使用lft / rgt可以轻松遍历/检索父母/孩子一直在树上,而不需要连接到自身。

答案 1 :(得分:0)

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

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

邮政编码边界是另一个问题 - 并非所有五位邮政编码完全属于单一状态 - 因此您无法将邮政编码定义为单个州的子邮件。

这就是国际化问题。

你正试图为已经解决的问题创建一个新的解决方案,我担心。