我想将Continents,Countries和Cities加载到下面的组合框中。所以我需要在这些之间建立联系。意味着城市需要在一个国家和一个国家属于一个大陆。所以当然我在谈论一个树形结构。那么我该如何以高效的方式在MYSQL数据库中实现呢?需要多少桌子?如何做到这些之间的关系?
这是图像。
答案 0 :(得分:2)
有正式的方法来表示任意树,但我认为以下更简单,应该足够了:
CREATE TABLE Continents (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
PRIMARY KEY (id),
UNIQUE (name)
)
CREATE TABLE Countries (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
continent INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (continent) REFERENCES Continents(id),
UNIQUE (name)
)
CREATE TABLE Cities (
id INT AUTO_INCREMENT NOT NULL,
name VARCHAR(20) NOT NULL,
country INT NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (country) REFERENCES Countries(id),
UNIQUE (name)
)
我没有测试代码,因此可能存在一些语法错误。但我希望这个意图很明确。
@Vmai在他对这个问题的评论中提出了一个很好的观点
我的解决方案是让#34;问题国家"一次在他们所在的每个大陆的国家表中。(因此土耳其将在数据库中两次,一次将continent
设置为亚洲id
,一次设置为id
欧洲。与俄罗斯相同。)当然,城市也是如此。
答案 1 :(得分:2)
您需要的只是一个表。只要数据结构相同,就没有理由拥有三个表。这样,您就不关心深度以及管理位置的组织方式。
+-------------------------+
| locations |
+-------------------------+
| location_id (int) | primary key
| location_name (varchar) |
| parent_id (int) | index
+-------------------------+
或其他解决方案
+-------------------------+
| locations |
+-------------------------+
| location_id (int) | primary key
| location_name (varchar) |
| left (int) |
| right (int) |
+-------------------------+
待解释......