1. EAV表(エンティティ - 属性値)
2.単一テーブル継承
3.エンティティのテーブル継承
4.クラステーブル継承
5.半構造設計
1. EAV表(エンティティ - 属性値)
CreateTable note_dictionary
(
dictionary_idnumber、
dictionary_type VARCHAR2(50) - このタイプの記録は、その20件の以上のレコードが存在します
dictionary_nameはVARCHAR2(200) - これは記録の名前です
);
- ストアは、このコンテンツを記録します
CreateTable note_content
(
content_idnumber、
note_id数、 - 現在の特定のレコードID
dictionary_idnumber、 - このフィールドIDの記録
フィールドの内容 - contentvarchar2(1000)
);
優位
1.柔軟、削除フィールドは、データベーステーブルの構造を変更する必要はありません。関係なく、エンティティの継承の存在、あなたが保存されたEAVを使用することができます。
2.デザイン単純なデータベーステーブル(ID、ATTR_NAME、値)
短所:
プロパティ値の1種類に制約することはできません。あなたは日付と番号であれば、それだけでVARCHAR2に表現することができます。統計にも問題がある可能性があります
2.制約とNOT NULLのデフォルト値を追加しないでください。
3.ポスト・保守データより難しいです。
4.関係を確立するために、このレコード間の関係は、存在する場合、非常に複雑な達成するためにテーブルを追加する必要があります。
5.いくつかの時間後に内容のテーブルは、システムのデータ量の場合には、非常に重くなります。
6.確かに体全体に影響を与えます。変更は、他の場所で影響を受けたかどうかを判断することはできません。リフレクションを使用してJavaコード、デバッグの困難な問題を見つけるのは難しいのデバッグ
7.複雑なクエリが複雑になります。
8.リレーショナルデータベース自体の利益を犠牲にします
9.整合性チェックは、特性(外部キー)を使用することはできません
2.単一テーブル継承
エンティティの継承システムのすべての属性がテーブルに格納され、
次のようにエンティティの属性は次のとおりです。
データベースの設計は、次の通り:
ユーザテーブル:
優位
データベース設計のシンプル
リストは、サブクラスに関する完全な情報を取得するためにクエリする必要はありません
設計上の欠陥の多くを避けるEAV
恵まれません
表サブクラスのプロパティ変更するユーザー追加するとき(ロックテーブルを、影響は大量のデータです)
サブクラスの場合、無関係な属性は、件名が表示されますの学生は、そのような教師のライン登場student_numberとして、表に表示されます
使用シナリオ:
少ない中性子クラスプロパティ継承システム状況。例えば、予見可能な時間サブクラス属性内の比較的少しの時間は、すべての後に、簡単なクエリは、クエリが分割表を必要としない、このような方法で使用することができます。
3.エンティティのテーブル継承
プロパティは、各エンティティが完全なテーブルに対応することを、完全なエンティティ、エンティティテーブル継承です。
この設計の長所と短所:
優位
完全なオブジェクトの場合1.分割表のクエリを必要としません。
2.表には、(単一テーブル継承と比較して)いない無関係な属性はありません
恵まれません
1.属性を追加する際に、基本クラスにテーブルの複数を変更する必要があり(誕生日のユーザーの追加クラスなどの属性、あなたが先生に必要な/学生のテーブルに列を追加しています)
2.テーブルのオープン構造、ノールッククラスの継承
4.クラステーブル継承
次のように、ユーザテーブル、先生テーブル、学生テーブル(教師と生徒のテーブルテーブルは外部キーを持つ):次に、データベーステーブルの設計はまた、3つのテーブルがあります。
優位
データベーステーブル、データベーステーブルの明確な階層は直接の継承を反映しています
何も変更は、属性を追加するとき、基底クラスが追加複数列の表の属性を追加する必要はありません基本クラステーブル(ユーザ・テーブル)のサブクラスではない場合
複数のテーブル(比較実体のテーブル継承スキーム)クエリメッセージ基本クラスの先生、学生さんを照会する必要はありません。
恵まれません
フルデータテーブル関連クエリ(テーブルクエリ性能差を有するデータテーブルの大量)必要オブジェクトを取得します
5.半構造設計
OTHER_PROPERTIESフィールド、オブジェクトが教師のために格納されている{被写体=英語}、学生デポジットの対象:{student_number = 123}
だから、メモリにレコード全体の完全な問い合わせを照会すると、その後、オブジェクトに変換します。
優位
子プロパティを追加するには、列の必要性を追加する際にスケーラビリティが、さらにはベースクラスに追加される列の属性
単純なクエリは、各行は、テーブルのクエリを連結することなく、オブジェクトの完全な情報に対応します
恵まれません
問題の非構造化部分はまだEAVデザインです。
何の制約は(MySQLは、ユーザー定義の名前と呼ばれるユーザ名、小企業は、ユーザ名として感じないではないかもしれない)オブジェクト属性名
あなたは(小さな「ABC」で、トラフィックは感じないかもしれない年齢はint型を定義されていない)属性値の種類を制限することはできません
単一のオブジェクトデータの面倒を取得します(完全なクエリオブジェクトは、あなたが直接ユーザーオブジェクトにマッピングすることができない複数のレコードを取得する必要があります)
整合性チェック機能は使用できません(いない外部キー)
DB(等合計、カウントなど)集計関数の使用不能に構造化されていない部分