在我的数据库中有四个数据库:教师,学生,家长和地址。
教师,学生,家长可以拥有任意数量的地址(零或更多)。
我想使用外键来链接教师和他们的地址(以及学生和他们的地址之间等)。
由于地址中的记录可以来自教师,学生或家长,因此我无法在地址中使用(单个)外键。由于教师等可以拥有任意数量的地址,因此我无法在教师记录中使用无限数量的外键。
这里有什么好策略?
我在考虑使用中间表,但这看起来有点麻烦。另外,让每个地址记录包含3个(可空)外键并且只使用一个?是个好主意吗?
答案 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的教师到地址表等...