[DB]テーブルをデザインしましょう!3
15691 ワード
1.契約戦略
各エンティティをテーブルとして作成し、サブテーブルは親テーブルのプライマリ・キーを受け入れ、pk+fkとして使用します.
*注:オブジェクトはタイプで区別できますが、テーブルにはタイプの概念はありません.
Dtype列など、タイプを区別する列が必要です
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID")
public class Book extends Item {
private String author;
private String isbn;
}
@inheritance
継承マッピングは、親クラスで@Inheritanceを使用する必要があります.そして、マッピングポリシーを指定するためにInheritanceType.JOINEDを使用しています
@DiscriminatorColumn
親に区切りバーを指定します.格納されているサブテーブルはこの列で区切ることができます.デフォルトはDTYPEです.
@DiscriminatorValue
エンティティを保存するときに、区切りバーに入力する値を指定します.既定値はエンティティの名前です.
@PrimaryKeyJoinColumn
サブテーブルのデフォルトのキー列名をnameプロパティで指定します.デフォルトは親テーブルのID列名です.
長所
-テーブルが正規化された.
-外部キーを使用して整合性制約を参照できます.
-ストレージスペースを有効に使用します.
短所
-クエリーでは結合が頻繁に使用されます.適切に使用しないと、パフォーマンスが低下する可能性があります.
-クエリは複雑です.
-データ登録時にINSERT SQLを2回実行します.
2.単一テーブル
単一のテーブルは、すべてのデータを1つのテーブルに配置します.
どのサブデータが格納されているかを区切りバーで区切り、クエリー時にチェックインしません.
*注:子エンティティマッピングのすべてのコラムはNULLです.
'
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DTYPE")
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {
private String artist;
}
@Entity
@DiscriminatorValue("M")
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID")
public class Book extends Item {
private String author;
private String isbn;
}
長所-結合する必要はありません.一般的にクエリーのパフォーマンスが速いです.
-クエリは簡単です.
短所
-サブエンティティマッピングのすべてのカラムにnullを許可する必要があります.
-すべてのコンテンツを1つのテーブルに保存するため、テーブルが大きくなる可能性があります.そのため、クエリのパフォーマンスが逆に遅くなる場合があります.
3.実装クラスごとにテーブルを作成する
サブエンティティごとにテーブルを作成し、必要なすべてのカラムを作成します.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id
@GeneratedValue
@Column(name = "ITEM_ID")
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
区切りバーは使用しません.一般的には使用しません.長所
-サブタイプの処理を区別する場合に有効です.
-not null制約は使用できます.
短所
-複数のサブテーブルを同時にクエリーする場合、パフォーマンスが低下します.
-SQLでUNIXを使用する必要があります.
-上記のサンプルコードでem.find(Item.class)などのコンテンツを呼び出す場合は、すべてのサブテーブルをクエリーする必要があります.
-サブテーブルを結合してクエリーするのは難しいです.
@MappedSuperclass
親がマッピング情報をテーブルにマッピングせずに継承された親の子にのみ提供したい場合は、対応する宣言を使用します.@MappedSuperclassは抽象クラスに類似しており、@Entityは実際のテーブルにマッピングされますが、@MappedSuperclassは実際のテーブルにマッピングされません.マッピング情報を上に引き抜き、再使用するだけです.
@MappedSuperclass
public abstract class BaseEntity {
@Id
@GeneratedValue
private Long id;
private String name;
}
@Entity
public class Member extends BaseEntity {
// ID 상속
// NAME 상속
private String email;
}
@Entity
public class Seller extends BaseEntity {
// ID 상속
// NAME 상속
private String shopName;
}
@MappedSuperclassプロパティ
エンティティのマッピング情報をテーブルにマッピングせずにサブクライスに継承します.
該当する名前のクラスはエンティティではありません.
抽象クラスの作成を推奨します.
Reference
この問題について([DB]テーブルをデザインしましょう!3), 我々は、より多くの情報をここで見つけました https://velog.io/@tjdud3550/DB-테이블을-설계하자-3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol