1

我有一个概念性问题,我希望更精通 sql 数据库设计的人可以帮助我。我有一个表,其中每一行在其他几个表之一中都有对应的行。IE。表 1 中的行在表 2、表 3 或表 4 中都有对应的行(但永远不要超过 1……对应的行只能在其他表之一中)。

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

有没有人有什么建议?

4

2 回答 2

3

我会使用第二种解决方案,并使用触发器来确保不超过一个相关行存在。

查询如下所示:

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
于 2012-10-03T16:35:39.100 回答
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')
)
于 2012-10-03T16:54:16.407 回答