1

SQLデータベース設計に精通している誰かが私を助けてくれることを望んでいるという概念的な質問があります。他のいくつかのテーブルの1つに、各行に対応する行があるテーブルがあります。つまり。テーブル1の行には、テーブル2、テーブル3、またはテーブル4のいずれかに対応する行があります(ただし、1つを超えてはいけません...対応する行は他のテーブルの1つにのみ存在できます)。

この構造を設定するための最良の方法は何ですか。othertable_id列とtablename列をテーブル1に配置すると、他のテーブルに対応する行が1つしかないことを保証できますが、これは非常に柔軟性のない厄介なソリューションのようです。一方、table2、table3、table4にtable1_id列だけを配置すると、table1の行に対応する行を見つけるたびに、3つの異なるクエリを実行する必要があるように見えます。 table1の行の3つのテーブルのいずれかに1つのエントリしかないことを保証できません。

誰か提案はありますか?

4

2 に答える 2

3

2番目のソリューションを使用し、トリガーを使用して、関連する行が1つだけ存在するようにします。

クエリは次のようになります。

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 に答える