1

3 つのテーブルがある場合:

music_genres
-----------
music_type_id
genres
[other unique fields]

minerals
--------
mineral_id
mineral
[other unique fields]

verbs
-----
verb_id
verbs
[other unique fields]

これらには次の情報が入力されています。

rock
jazz
funk
punk

rock
boulder
stone
shale

rock
wobble
shake
vibrate

ここで、これらの項目ごとに個別のテンプレートを使用して Web ページを表示し、この情報を次の表に格納したとします。

pages
-----
page_id
page_url
template_url
foreign_key_id

次のようなデータを使用します。

/page/music-genres/rock/
/music-genres-template.html
1

/page/verbs/rock/
/verb-template.html
1

/page/minerals/rock/
/mineral-template.html
1

/page/minerals/rock/images/
/mineral-images-template.html
1

テンプレートは、外部キーが特定の関連テーブルに関連していることを認識しているため、鉱物テンプレートは、そのテーブルの他のフィールドについて鉱物テーブルにクエリを実行することを認識しています。ただし、参照整合性はありません。鉱物テーブルからロックが削除された場合、カスケード削除を使用してページから行を削除することはできません。外部キーは一意ではないためです。これをエレガントに回避する方法はたくさん考えられます。

  • トリガーによるカスケード削除のエミュレート
  • music_types、minerals、verbs テーブルの各行に項目タイプを格納し、これを追加の外部キーとして使用する
  • 適切なテーブル名をページ テーブルに格納する
  • PHPなどでデータベースの整合性を維持しています。

データを保存するか、データベースの整合性を維持するためのより良い方法があるに違いないと考えています。何かご意見は?

4

1 に答える 1

3

あなたの問題はここにあると思います

テンプレートは、外部キーが特定の関連テーブルに関連していることを認識します。

それは、データベースのどこにも保存されていない知識です。

私はそれから2つの方法を見ます:

  1. 実際に「モノ」のタイプごとに個別のテーブルを作成していることを考えると、ページ テーブル内の適切なテーブルを参照するモノのタイプごとに異なる列を用意し、1 つを除いてすべての列を null に設定する必要があります (これは、制約)

  2. タイプを識別する列と、別のテーブルに格納される残りの一意のデータを指す列の両方を持ち、ページが参照できる一意の ID を持つ「マスター シングス」テーブルを用意します。

于 2009-09-26T15:16:07.000 に答える