在MySQL数据库中实现树结构

时间:2014-07-10 15:57:50

标签: mysql

这个问题可能会被几个人问到。但我仍然没有得到正确的答案。所以这就是

我想将Continents,Countries和Cities加载到下面的组合框中。所以我需要在这些之间建立联系。意味着城市需要在一个国家和一个国家属于一个大陆。所以当然我在谈论一个树形结构。那么我该如何以高效的方式在MYSQL数据库中实现呢?需要多少桌子?如何做到这些之间的关系?

这是图像。

http://i.stack.imgur.com/st4oz.jpg

2 个答案:

答案 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)     |       
+-------------------------+

待解释......

相关问题