我有一个概念性的问题,我希望有更多精通sql数据库设计的人可以帮助我。我有一个表,其中每一行在其他几个表之一中有一个对应的行。 IE浏览器。表1中的行在表2,表3或表4中具有相应的行(但是从不超过1 ...相应的行只能在其他表中的一个中)。
设置此结构的最佳方法是什么。如果我在表1中放入一个othertable_id列和一个tablename列,我可以保证在其他表中只有一个对应的行,但它似乎是一个非常不灵活的混乱解决方案。另一方面,如果我只在table2,table3和table4中放置一个table1_id列,那么每次我想要找到与table1中的行对应的行时,我似乎需要运行3个不同的查询,看起来好像我无法保证在table1中的行中只有三个表中的任何一个表中都有一个条目。
有人有任何建议吗?
答案 0 :(得分:2)
我会使用第二种解决方案,并使用触发器来确保不存在多于一个相关行。
查询看起来像:
select *
from table1 t1
left outer join table2 t2 on t1.id = t2.table1_id
left outer join table3 t3 on t1.id = t3.table1_id
left outer join table4 t4 on t1.id = t4.table1_id
如果您想要的表格中有一个共同的列,例如value
,则可以这样:
select t1.*,
coalesce(t2.value, t3.value, t4.value) as value
from table1 t1
left outer join table2 t2 on t1.id = t2.table1_id
left outer join table3 t3 on t1.id = t3.table1_id
left outer join table4 t4 on t1.id = t4.table1_id
答案 1 :(得分:0)
我想我没有看到设置与子表关系的复合键有什么问题。如果这是您的逻辑模型的工作原理,请不要试图过于聪明并且混淆任何试图找出依赖关系的人。
使用示例可以更轻松地解决问题,可能以下工作:
A college contains students, professors, and assistants.
It needs to keep track of each individual's name and address.
In addition it holds :
for students, their GPA
for professors, their office address
for assistants, their professor
我会建立一个类似于以下的模型:
person { person_id, name, address }
student { person_id, gpa }
professor { person_id, office_address }
assistant { person_id, professor_id }
当我去实现这个时,我很可能最终得到类似的东西:
CREATE TABLE person (
person_id, type, name, address,
PK (person_id)
)
CREATE TABLE student (
person_id, gpa,
PK(person_id),
FK(person_id to person.person_id),
CK(person.type = 'student')
)