sql表行在其他几个表中有一个对应的行

时间:2012-10-03 16:33:19

标签: mysql sql database sqlite

我有一个概念性的问题,我希望有更多精通sql数据库设计的人可以帮助我。我有一个表,其中每一行在其他几个表之一中有一个对应的行。 IE浏览器。表1中的行在表2,表3或表4中具有相应的行(但是从不超过1 ...相应的行只能在其他表中的一个中)。

设置此结构的最佳方法是什么。如果我在表1中放入一个othertable_id列和一个tablename列,我可以保证在其他表中只有一个对应的行,但它似乎是一个非常不灵活的混乱解决方案。另一方面,如果我只在table2,table3和table4中放置一个table1_id列,那么每次我想要找到与table1中的行对应的行时,我似乎需要运行3个不同的查询,看起来好像我无法保证在table1中的行中只有三个表中的任何一个表中都有一个条目。

有人有任何建议吗?

2 个答案:

答案 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')
)