我需要代表教师与他们教授的科目之间的多对多关系。
实施时,会想到一些策略:
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进行索引,我使用数字,但为了清晰起见,我已经这样绘制了
答案 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个主键。