我的目标是将位置存储在一个表中,但是为了存储一个位置,我还想将它链接到另一个位置。
示例:值为“棕榈滩”我还想将其链接到“佛罗里达州”和“美国”以制作地址:
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答案 0 :(得分:1)
对此的简短回答是,我使用嵌套集模型解决了这个确切的问题(按层次结构排列的地理区域)(http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/提供了更多信息)
更长的答案是你不应该为每个级别创建一个单独的表,因为它不能轻易地扩展到“n”级别,并且没有从级别n到级别1的简单路由。出于这个原因,想法#1是你应该追求和阐述的那个。
如果有任何疑问,请坐下来看看你复制了多少桌面结构。如果您完全复制了表结构,则它们(通常)不应该是单独的表,因为复制表示您正在存储相同的数据。而是研究如何将它存储在一个表中。
在我的“地区”表格中,我有以下列(等等)
regionID
和parentRegionID
足够容易填充。然后,我使用存储过程生成lft
和rgt
值,这些值在我链接的article中详细使用。
存储直接父ID的好处是您可以更轻松地操作树。您不需要这样做,并且可以使用添加/移动/删除树节点的过程轻松地存储lft
和rgt
使用lft / rgt可以轻松遍历/检索父母/孩子一直在树上,而不需要连接到自身。
答案 1 :(得分:0)
人们在很长一段时间内将地址存储在大型平面表中是有充分理由的 - 它们处理起来非常混乱,而您所寻求的理论层次结构无法通过真实世界数据实现。
例如,可能有一个城市的“棕榈滩”,很容易与一个国家联系,但有多少个城市被命名为“伦敦”,“牛津”,“斯普林菲尔德”等?很多人,当然还有不同的州。因此,知道一个城市被命名为“牛津”并不足以识别它 - 它只是在一个国家的背景下是独一无二的。
邮政编码边界是另一个问题 - 并非所有五位邮政编码完全属于单一状态 - 因此您无法将邮政编码定义为单个州的子邮件。
这就是国际化问题。
你正试图为已经解决的问题创建一个新的解决方案,我担心。