1

今日再び Hibernate Enum Mapping を使用した後、もう少し拡張するのが良い考えかどうか疑問に思っていました。
私の考えがどこから来たのかを説明すると: もちろん、私たちはアプリケーションの正規化されたデータ モデルを目指しており、その結果、多くの場合、カテゴリ、状態、または同様のデータを含む多くのテーブルが得られます。通常、これらのテーブルには非常に少数の列 (多くの場合、PK と 1 つまたは 2 つのコンテンツ列のみ) と行があります。また、これらのテーブルの内容が変更されることはほとんどなく、まったく変更されないこともあります。
そのために列挙型を使用し、序数または整数 (どちらも Hibernate を使用しますが、任意の ORM でそれができると思います) でテーブルにマップすると、両方のパフォーマンスが向上します (結合が少ない) ) と処理 (Java の列挙型は非常にエレガントに使用できます)?

物事を少し明確にするために:

テーブル PERSONS
ID: 数値
名前: Varchar
RELATIONSHIP_STATUS_ID: 数値

テーブル RELATIONSHIP_STATUS
ID: 数値
STATUS: Varchar

内容 人:
1 | ジョン・ドウ | 1
2 | メリー・ポピンズ | 2

コンテンツ RELATIONSHIP_STATUS
1 | シングル
2 | 結婚

ここで、ステータス テーブルをダンプし、これら 2 つのステータスを列挙型にして、それを序数で列にマップします。
これは理にかなったことでしょうか?この種の設計がパフォーマンス面でより優れているかどうかに特に興味があります.

4

1 に答える 1

1

テーブルと列挙型のどちらを選択するかについての私の要因は次のとおりです。

  • 可能な値のリストは将来変更される可能性があり、それが発生したときにアプリを再コンパイル、再テスト、および再デプロイしたくありません: テーブルを使用します。
  • 可能な値のリストは将来変更される可能性がありますが、テーブルのすべての値はコード自体で使用され、いくつかのビジネス ロジックを実装します (if status == Married then do something else do something など):とにかく可能な値のリストが変更された場合はロジックなので、列挙型を使用します
  • リストは決して変更されません: 列挙型を使用します

ただし、テーブルを保持し、コードで列挙型を使用することはできます。これにより、列挙型がどのように実装されているかわからない場合に、データベース内のデータを見るだけでより明確になります。0 が既婚、1 が独身というのは、まったく自明ではありません。参照用にテーブルを保持する場合、少なくとも値の意味を把握し、データに 2 またはその他の数値を挿入できないことを確認できます。

もう 1 つの方法は、序数ではなく列挙型の名前を使用することです。より多くのスペースを占有し、効率は少し低下しますが、データがより明確になり、分析がより簡単になります。ただし、チェック済み制約を追加しない限り、安全性は失われます。

于 2013-02-06T20:57:21.297 に答える