web-dev-qa-db-ja.com

複数のテーブル間の関係を作成するための最良の方法

複数の関係間で共有されるテーブルを最適に処理する方法について質問がありますが、実際にはこれらすべてのテーブルと結合するべきではありません。たとえば、米国の州を含むテーブルがあるとします。次に、この例では、Statesテーブルと関係のある他のテーブルが3つか4つあります。たとえば、Usersテーブル(ユーザーの出身地)、Car登録テーブル、Emailテーブル(このシステムでは、送受信された電子メールとその発信元を追跡します)およびその他のテーブル。これらすべてのテーブルをStateテーブルに結合すると、これらのテーブルすべてが相互に何らかの関係を持っているように見えます。たぶん、これはいくつかのテーブル(ユーザーと車の登録など)には当てはまりますが、必ずしもすべてのテーブル(たとえば、ユーザーと電子メールテーブル)の間ではありません。または、別の例として、EmployeesとWork_Officeの2つのテーブルがある場合があります。それぞれに独自の状態があります。そして、それぞれが互いに結合され、ループが作成されます(Work_Officeには多くの従業員がいます。従業員はStateに属し、Work_OfficeはStateに属します)。これでループができました。

それで、複数の「状態」テーブルを持つ方が良いでしょうか?そうではないようです。しかし同時に、私は実際には存在しないかもしれない関係を作りたくないのですか?それとも、テーブルを持っているだけで、実際にはいかなる種類の関係も作成しない方が良いでしょうか?

1
jason

いいえ、複数の状態テーブルを作成しないでください。他のテーブルとの関係を持つ単一のテーブルを持つことは、これにアプローチする正しい方法です。これは、状態を共有する以外に、他のテーブルがリンクされていることを何らかの形で意味しているという認識は、純粋にあなたの頭の中にあります-そのような解釈は一般的な慣行ではありません。

論理データモデルと物理データベース設計を区別する必要があります。 Stateへの関係を論理モデルに追加することをお勧めします。パフォーマンスまたはその他の理由で、データベースから外部キー制約を省略することを選択できます。

デルのToadサイトに、今は見つからない投稿があります。これは約200のテーブルDBであり、そのすべてにUpdateUserId列があり、Userテーブルに対応するFK関係があります。 DELETE User..ステートメントの計画は美しいものです-200の結合の完全な左の深い三角形!それらは制約がなければもっと良かったでしょう。

編集:ここに リンク 。詳細を覚えていませんが、原理は同じです。

2
Michael Green

「同じ状態にある」とは関係です。それが意味のある関係であるかどうかは、議論されている主題に依存します。政党に関するデータベースであれば、非常に意味があるかもしれません。ほとんどのアプリケーションでは、それは完全に無意味です。

テーブルの設計から意味を推測することは、「データフォレンジック」またはリバースエンジニアリングに少し似ています。うまくいくこともあれば、うまくいかないこともあります。テーブルのデザインとテーブルのリンクに関するモデルに加えて、意味に関するモデルが必要です。

テーブルの設計は、将来の使用の可能性を含め、データの使用目的を容易にするものに基づいて行う必要があります。

1
Walter Mitty

関係は、必ずしも図がどのように見えるかではなく、データ自体に基づいている必要があります。状態の例では、状態テーブルとの関係(外部キー)がある場合、状態列の値は状態テーブルの値に制限されます。ペンシルベニアの「PA」の状態列に値を入力することは完全に問題ありませんが(状態テーブルに存在すると仮定)、値が「AP」として入力された場合、その値は有効ではないため、まったく不適切です。状態であり、状態テーブルには含まれません。外部キーの関係により、データの整合性が維持されます。そのデータの整合性を失うと、データは無価値になります。

0
EdgeOfKnowWare