2017-12-18 14 views
-2

私は1つの質問を考えており、いつも私たちの日常生活の中で起こっています。 たとえば、私はtable1に20の列、table2には30の列、table3には40の列があります。しかし、1,2,3の表には共通の10の列があります。共通の属性を持つSQLテーブルについて

いくつかの例では、これをコンテキストに入れています。

ペットショップには、犬、猫、金魚などのデータがあります。すべてのペットは名前、価格、取得日などがありますが、ペットの種類には他の種類の属性はありません。

車両に関するデータベースには、自動車、トラック(ローリー)、オートバイに関するデータがあります。彼らはすべて車両識別番号、登録番号、製造年を持っています。しかし、彼らはそれぞれ独自の属性も持っています。

顧客に関するデータベースには、顧客である企業および顧客である個人に関するデータがあります。彼らはどちらも電話番号を持っていますが、属性もそれぞれ異なります。

だから、DB構造のための共鳴するデザインは何ですか?

A:20,30,40列の3つのテーブルを作成しますか? B:10,20,30列の3つのテーブルと10の共通列を持つ別のテーブルを作成する場合は、共通のテーブルの共通情報に参加する必要があります

このパフォーマンスを分析するには質問? SQLの作業原則について知りませんが、いくつかの調査を行います。 誰もがデザインと異なるパフォーマンスに関するあなたのアイデアを共有することができます

+0

[DBA Exchange](https://dba.stackexchange.com/help/on-topic)でクエリのパフォーマンスについて質問する必要があります。 – F0XS

+0

条件を追加する列にインデックスを追加する必要があります –

+1

これはあまりにも広い質問です。トランザクションの状況では、複製/冗長列を正規化する方がよいでしょう。しかし、必ずしもそうではありませんが、モデルがこれらの3つのテーブルを最初に持っている理由に依存します。おそらく、さまざまな制約が存在します。分析的な状況では、キャッシングの種類として分離しておく方が良いかもしれません。また、3つのデータセットがすべて同じテーブルにあるように正規化する方が良いため、SQLを書くのがはるかに簡単です。したがって、コンテキストなしでは、それは... *** – MatBailie

答えて

3

この種の問題は、データモデリングで何度も繰り返されています。 ERモデリングでは "一般化/特殊化"と呼ばれ、オブジェクトモデリングでは "スーパークラス/サブクラス"と呼ばれます。

オブジェクトモデラーは、オブジェクトモデルに組み込まれている継承機能を使用して、問題を非常に簡単に解決します。サブクラスは単純にスーパークラスを拡張します。 リレーショナル・モデラーは問題に直面しています。継承から得られる利点をエミュレートするようにテーブルを設計する方法は?それがあなたが提起した質問です。

最も簡単な手法は、単一テーブル継承です。すべてのサブクラスに関するデータは、スーパークラスの単一のテーブルにグループ化されます。 1つのタイプのすべてのオブジェクトをグループ化するcolumn object_typeがあります。オブジェクトは複数の型に属することはできません。列がサブクラスの1つと無関係な場合、そのサブクラスに関連する行にはNULLが残ります。

この単純なソリューションは、より小さくて簡単なケースでうまく機能します。多くのNULLが存在すると、ストレージのオーバーヘッドにはわずかなビットが追加され、オーバーヘッドには少ししか追加されません。ブールテストがNULL可能な列に対して実行される場合、開発者はSQLの3値論理を学習する必要があります。これは最初は困惑しているかもしれませんが、慣れてしまいます。

クラステーブルの継承という別の手法があります。この設計では、特殊なサブクラスごとに別々の表があり、そのすべての表が結合されています。特定の種類のオブジェクトに関するすべてのデータが必要な場合は、一般テーブルを適切な特殊テーブルに結合します。このデザインではNULLが少なくなりますが、さらに結合することになります。この手法は、より大きくて複雑な場合に効果的です。

共有プライマリキーと呼ばれる3つ目の手法があります。このテクニックは、クラステーブルの継承と組み合わせて使用​​されることがよくあります。サブクラスの特殊テーブルは、そのプライマリキーとして、一般テーブルの対応するエントリのプライマリキーのコピーを持ちます。このid列は、主キーと外部キーの両方として宣言できます。

これは、新しいオブジェクトを追加するときに少し余計なプログラミングが必要になりますが、結合が簡単で簡単で高速になります。

スーパークラスとサブクラスは、現実世界で常に発生します。あなたのデザインをシンプルで健全なものにします。パフォーマンスの初期設計をテストします。あなたが必要な場合はそれを微調整してください。

関連する問題