0

Hibernate のドキュメントには、次のように記載されています。

5.1.6.5. 1 つのエンティティを複数のテーブルにマッピングする

新しいスキーマには推奨されませんが、一部のレガシー データベースでは、1 つのエンティティを複数のテーブルにマップする必要があります。

私はデータベースの正規化について多くのことを読みましたが、いくつかの異なるエンティティをマップし、奇妙な結合ステートメントを手動で実行しない限り、データベースを正規化し、複数のデータベーステーブルにエンティティをマップしない方法をよく理解していません。または、7 つの異なるエンティティをマッピングし、それらを 1 つの POJO に転送します。正規化され、単一のエンティティを使用してデータベース データから Java オブジェクトに変換する「新しいスキーマ」を開発する方法を示す場所はありますか?

また、今日の安価なストレージの世界では完全な正規化が必要ではないことも理解していますが、この声明は私が読んだ他のすべてのものと矛盾していることに気づきました. 正規化と非正規化のバランスを探していますが、Java Persistence API を使用した簡単な方法は見つかりませんでした。

編集:

例:

次のユーザーエンティティがある場合:

@Entity
public class User {
    long id;        
    String name;
    String email;

    int countryCode;

    List<Images> uploadedImages;
}

ユーザーの国名と画像のコレクションを同じテーブルに格納するのではなく、国を 1 つのテーブルに格納します。

Table Countries    Country_Code    Country_Name
                   AF              Afghanistan etc....

国コードと国名を使用して、次に に、ユーザー ID を使用して別のテーブルに画像をアップロードし、

Table UploadedImages    User_Id      Image_Name    Image_Url
                        1            Hello.jpg     Amazon S3
                        1            Goodbye.jpg   Photobucket

では、1 つのエンティティのみでこれを行うにはどうすればよいでしょうか。または、最初のエンティティからの情報を使用して、データベースから 3 つの個別のエンティティを取得する必要がありますか? おわかりのように、基本的なスキーマについて少し混乱しています。上記のデータを Java オブジェクトに変換するにはどうすればよいでしょうか?

4

2 に答える 2

1

あなたの例を考えると

@Entity
public class User {
    long id;        
    String name;
    String email;

    int countryCode;

    List<Images> uploadedImages;
}

ここでは、3つのエンティティ(ユーザー、国、画像エンティティ)があり、それぞれがおそらく3つのテーブルにマッピングされています。テーブルごとに1つのエンティティと、画像のリスト用の結合テーブルです。

したがって、Userクラスは次のようになります。

@Entity
public class User {

    long id;        

    String name;

    String email;

    Country country

    List<Images> uploadedImages;
}

@Entity
public class Country {

    long id;        

    String name;

}

@Entity
public class Image{

    long id;        

    String name;

    String url;

}

また、アノテーションを追加して、プロパティを正しいテーブルと列にマップします。

于 2012-08-10T14:07:55.763 に答える
0

ドキュメントに記載されていることは、データの正規化とは何の関係もありません。これは、データパーティション/テーブルの最適化と関係があります。したがって、大きなバイナリを保持する列を持つテーブルがある場合、それをメインデータと同じテーブルの一部にしたくない場合があります。当時、今日の測定では小さいと見なされていたデータは「大きい」と見なされていたため、これは過去により一般的でした。

一方、正規化はOOP(およびHibernate)では大歓迎です。冗長性と依存関係を最小限に抑えるために、物事をその場所に保持することがすべてです

于 2012-08-10T07:50:48.423 に答える