2

私はこの設計上の問題に直面し続けており、これまでの解決策には満足していません。問題はこれです:

People や Dogs などの 2 つ以上のエンティティがあり、それらは両方とも、メッセージ フィールドと作成者などのメッセージに関するメタ データを格納する Notes テーブルと関係があります。

1) 最初のオプションは、外部キーを強制しないことです。そうすれば、fkId などの同じ汎用 FK フィールドに peopleId や dogId などの FK を (それが何であれ) 格納できます。次に、tableId を別の列に保存します。RDMS メタデータからテーブル ID を取得することを期待できますが、手動で更新する必要があるテーブルでいっぱいのテーブルを明示的に作成することもできます。 . これは本当にずさんで、完全を期すために言及しています。

2) PeopleNotes、DogNotes、CatNotes など、必要な各テーブルの Notes テーブルを複製します。これにより、正規化に関する非常に大きな問題が発生します。

このような状況で他の人々は何をしましたか?

4

5 に答える 5

6

これらが「モデル」テーブルの場合:

dog Table:
id | name | ...
1  | Rex
2  | Fido

people Table:
id | name | ...
1  | Bob
2  | Alice

notes Table:
id | text | ...
1  | A nice dog.
2  | A bad dog.
3  | A nice person.

リレーションシップを別のテーブルに保持できます。

dog_note Table:
dog_id | note_id
1      | 1
2      | 2

note_people Table:
person_id | note_id
1         | 3
2         | 3

私は通常、モデルのアルファベット順を使用してリレーションシップ テーブルに名前を付けるという規則に固執します。

于 2009-10-13T18:50:48.040 に答える
2

Dog2Notes と People2Notes という 2 つの新しいテーブルはどうでしょうか。Dog、People、および Notes はすべて、互いに関連する Key を持つエントリです。犬と人は複数のメモを持つことができ、メモを共有できます。

Dogs と People がそれぞれ 1 つのメモしか持てない場合、それらのテーブルのそれぞれに NOTEID を追加しますか?

于 2009-10-13T18:45:45.603 に答える
0

現在提案されているものよりも優れた解決策は、マスター ID テーブルを持つことではないでしょうか?

dog Table:
id | name | masterId
1  | Rex  |  1
2  | Fido |  4

people Table:
id | name | masterId
1  | Bob  |  2
2  | Alice|  3

masterId
id
1  
2  
3  
4  

notes
id | note       | masterId
1  | "Hi"       | 3
2  | "Good day" | 2

これにより、新しいエンティティ タイプ (例: cat) を追加する必要がある場合、別のテーブル (cat_note) を追加する必要がないため、スケーラビリティが容易になります。新しいノート タイプ (例: book) を追加すると特に便利です。すべてのエンティティ タイプ (person_book、dog_book など) に対して新しいテーブルを追加する必要があります。最後に、任意のエンティティ テーブルをメモ テーブルに直接関連付けることができます。

唯一の「問題」は、新しいレコードがエンティティ テーブルに追加されたときに新しいレコードを masterId テーブルに自動的に追加し、それを新しいエントリに関連付けるプロシージャを実行する必要があることです。

PS 私は、この答えが事後 9 か月のようなものであることを知っています。他の調査をしているときにこれにたまたま遭遇し、自分の2セントを投入したと思いました.

于 2010-06-04T21:32:23.863 に答える
0

データのクエリ方法によって異なりますが、人/犬ごとに複数のメモがあると仮定すると、次のようなものはどうでしょうか。

People テーブル

PeopleID
NoteID
.....

ドッグテーブル

DogID
NoteID
...

注テーブル

NoteID

注詳細テーブル

NoteDetailID
NoteID
NoteText
...
于 2009-10-13T18:51:05.653 に答える
0

ID 用とクラス/テーブル用の 2 つの列にメモの所有者を格納するという考えを好みます。

于 2009-10-13T18:45:37.647 に答える