数据库设计 - 多对多表 - 如何最好地表示

时间:2013-12-04 23:50:09

标签: mysql sql

我需要代表教师与他们教授的科目之间的多对多关系。

实施时,会想到一些策略:

 teacher_name | subject_names
 bill           math, english, science, french
 sally        | chemistry, english, arts & crafts

我已经拒绝了这个策略,因为使用逗号分隔值查询字段似乎效率不高,特别是当我将它们用于搜索引擎,迭代等时...虽然我肯定愿意听取保护这个策略

 teacher_name | subject_name
 bill           math
 bill           english
 bill           science
 ...            ...
 sally          chemistry
 sally          english
 ...            ...

我最初认为这是一个更好的主意,但当我查询有关教师的信息时,我会收到难以报告的数据。也就是说,对于鲍勃的主题我有5排是很好的,但是我发现他住在123主要街道并不好。和123主要的我主要认为这是一个更好的主意,但也许存在更好的主意。

顺便说一句,我并没有真正使用teacher_names和subject_names进行索引,我使用数字,但为了清晰起见,我已经这样绘制了

3 个答案:

答案 0 :(得分:1)

您可以为教师(id,teacher_name)创建另一个主题表(id,subject_name),另一个名为teacher_subject的表具有teacher_id,subject_id作为复合键。对于多对多关系而言,这是最常用的方法,因为它是标准化的。

答案 1 :(得分:1)

使用映射关系的第三个表 Junction Table 可以最好地解决多对多关系。这是一个good guide,它详细解释了一些,但基本上......

新表格表将包含两列外键;教师在一列中的唯一ID(教师表的主键),以及另一列中的科目唯一ID(科目表的主键)(...当然也是联结表的列它是自己独特的ID。)

说这是您的教师表

----------------------------
| ID   | Name  | Last_Name |
----------------------------
| 0001 | JOHN  | STEPHENS  |
----------------------------
| 0002 | BRUCE | WAYNE     |
----------------------------

这是您的主题表

-----------------------
| ID   | Subject_name |
-----------------------
| 0101 | MATH         |
-----------------------
| 0202 | BIOLOGY      |
-----------------------
| 0303 | ENGLISH      |
-----------------------

然后你需要一个像这样的联结表:

<强> TeacherSubject_JunctionTable

--------------------------------
| ID | Teacher_ID | Subject_ID |
--------------------------------
| 01 | 0001       | 0101       |
--------------------------------
| 02 | 0001       | 0202       |
--------------------------------
| 03 | 0002       | 0101       |
--------------------------------
| 04 | 0002       | 0303       |
--------------------------------

现在,每当您需要获得教授数学的教师列表(subject_id 0101)时,您只需查询juction表;

之类的东西
SELECT Teacher_ID FROM TeacherSubject_JunctionTable
WHERE Subject_ID = 0101;

或者反过来说,如果你想得到老师教的科目。

答案 2 :(得分:0)

你的两种解决方案都打破了正常化的战略

执行此操作的常规方法是使用第3个连接表。

teacher_ID | teacher_name | Other stuff about teachers
    1      |     bill     | address, dob etc.
    2      |    sally     | etc.

subject_ID | subject_name | Other stuff about teachers
    1      |    math      | department, campus etc.
    2      |   english    | etc.


teacher_ID | subject_ID   | Other stuff about the relationship
    1      |     4        | location etc.
    1      |     2        | etc.
    2      |     2        | etc.
    2      |     1        | etc.

teacher_ID&amp; subject_ID是前两个表中的自动递增int主键。 teacher_ID&amp; subject_ID是第3个主键。