关于多个一对多关系和外键的数据库设计问题

时间:2009-09-29 20:25:55

标签: sql database-design data-modeling

在我的数据库中有四个数据库:教师,学生,家长和地址。

教师,学生,家长可以拥有任意数量的地址(零或更多)。

我想使用外键来链接教师和他们的地址(以及学生和他们的地址之间等)。

由于地址中的记录可以来自教师,学生或家长,因此我无法在地址中使用(单个)外键。由于教师等可以拥有任意数量的地址,因此我无法在教师记录中使用无限数量的外键。

这里有什么好策略?

我在考虑使用中间表,但这看起来有点麻烦。另外,让每个地址记录包含3个(可空)外键并且只使用一个?是个好主意吗?

5 个答案:

答案 0 :(得分:2)

过去对我有用的东西是有一个context和context_id字段。上下文将是父记录(例如教师),context_id将是其id。所以,你有类似

的东西
teacher = find single teacher by id
addresses_for_teacher = find all addresses with context = 'teacher' and context_id = teacher.id

通过适当的索引表和健康的memcached服务,我们在Cork'd上看到了很好的结果。

答案 1 :(得分:2)

我会将这个(取决于你提到的4个表的结构)重新设计成1个表(People),它有一个类型列(Teacher / Student / Parent),这使得将person_id添加为外键变得更加简单地址

如果由于要求非常不同而需要为人们保留当前的3个表格,我建议在地址上设置3个字段唯一键:

address_id:sequence(表宽或每个person_type / persond_id) person_id:每个person_type表中的唯一ID person_type:值T,S,P(根据原始教师/学生/家长的不同而不同)

答案 2 :(得分:1)

为每个基表添加连接表。教师地址,学生地址,家长地址。

答案 3 :(得分:1)

使用表来表示关系可能就是这里的方法。您将需要Parent_Address,Student_Address和Teacher_Address表。它将使查询更加简单。

答案 4 :(得分:1)

你拥有的是多对多关系。因此,您需要一个连接表。

您在哪里定义具有学生ID和地址ID的学生到地址表,具有教师ID和地址ID的教师到地址表等...