如何设置MySQL数据库关系

时间:2009-03-17 21:24:15

标签: mysql database database-design

我有一个包含两个表“locations”和“classes”的数据库。我很熟悉在我的数据库表中设置某种父/子情况,但这个情况让我感到厌恶。

这种关系与你期望的完全一样。 “位置”有多个“类”。但是一些“类”位于多个“位置”。那我该怎么设置呢?是否需要创建第三个表来处理关系?

我正在使用MySQL / PHP(如果重要的话)

4 个答案:

答案 0 :(得分:3)

是的,你需要第三张桌子。这称为many-to-many relationship。该表(我建议)有一个主键,一个位置ID列和一个类ID列。

答案 1 :(得分:3)

是的,你需要第三张桌子,因为这是一对多关系。

 --------         -----------------
|Class   |       | ClassLocation   |        ------------
|--------|       |-----------------|       | Location   |
|Id      | <---- |ClassId          |       |------------|
|Name    |       |LocationId       | ----> |Id          |
|...     |        -----------------        |Name        |
 --------                                  | ...        |
                                            ------------

如果关系的方向很重要,甚至可能需要两个额外的表。如果“类属于位置”的含义与“位置属于类”的含义不同,则需要两个连接表,因为只有一个连接表不会告诉关系方向。但我猜你的情况并非如此。

答案 2 :(得分:2)

   locations           location_classes           classes

+----+-------+    +-------------+----------+   +----+-------+
| id | title |    | location_id | class_id |   | id | title |
+----+-------+    +-------------+----------+   +----+-------+
|  1 |   foo |    |           1 |        1 |   |  1 | clas1 |
|  2 |   bar |    |           3 |        1 |   |  2 | clas2 |
|  3 |  test |    |           1 |        2 |   +----+-------+
+----+-------+    |           2 |        2 |   
                  |           3 |        2 |
                  +-------------+----------+

答案 3 :(得分:1)

您需要一个联接表:

tbl_location
ID: int
Name: Varchar(20)

tbl_class
ID: int
Name: Varchar(20)


tbl_classlocation
ID: int
locationID: int
classID: int

沿着这些方向的东西,本质上是classlocation表连接另外两个(locationId和classID都是来自位置和类表的外键)