2012-04-02 8 views
2

「Gender」という名前の列を使用してエンティティをモデル化しています。アプリケーションコードでは、性別は2つの値(MALEとFEMALE)を持つ(Java)列挙型です。Enums as Datatypeが汎用SQL(言語)92の一部ではないことを知ってどのようにモデル化しますかデータベース内の(Java)列挙型をモデル化する方法(SQL92を使用)

いくつかのDBMS(Mysql、Oracle、Derby)といくつかの永続性プロバイダ(JPA、Hibernate、JDBC)によって使用されるために、データモデルは移植可能でなければなりません。 - 最初にスキーマとエンティティのレベル(-VAR-CHARまたはINTとして列挙型を格納) - アプリケーションコードのレベル(JDBCは列挙型をサポートしていません。 JPAは実装に依存します)

たとえば、Mysql DBMSに適用可能な汎用ソリューションはありますか? ありがとうございます!

+0

Modell? http://www.youtube.com/watch?v=FGMnhz6ibTY :) – Almo

+0

私はドイツから来て申し訳ありません;)私の英語は間違いなく改善します;) – arthur

+0

問題はありません!私はちょうど雰囲気を明るくするためにコメントに面白いものを投稿するのが好きです。 :D – Almo

答えて

2

通常、私は完全に正規化されたデータベーススキーマを提供する次のソリューションを採用しています。

  1. 列挙型を表す専用テーブルを作成します。例えばColour。テーブルには、2つの列があります。
    • ID列(主キー)です。通常は自動インクリメントint、smallintまたはtinyintです。
    • カラム(候補キー)。これはvarcharになり、その値はJavaの列挙と同じにする必要があります。
  2. データベースのColourテーブルと同じ値のJava enum:Colorを作成します。
  3. Colourテーブルを参照するレコードを含む「データ」テーブルがあると仮定して、レコードを挿入するためのストアドプロシージャを実装します。レコードセットには、色列値(Javaの列挙の説明に従って)が使用されます。例えば

    PROCEDURE dbo.InsertRecord @colourのvarchar型 AS(32) ...

ストアドプロシージャは、データテーブルを参照することができ、必要な文字列からint型変換を実行しますが、CREATE int外部キーによる表の色付け。

同様に、データテーブルのビューを作成して裏のColorテーブルに結合して、データの非正規化されたビアをアプリケーションまたはエンドユーザーに提示することができます。

ストアドプロシージャのアプローチの代替方法は、起動時にアプリケーション内の序数と名前のマッピングを読み取り、キャッシュすることです。これには、データベース内のColorテーブルの内容と比較して、Java Color列挙の整合性を検証できるという利点があります。

+0

より安全でポータブルなアプローチのようです。スキーマとデータを他のすべてのDBMSに移植することができます。ストアドプロシージャの構文を変更するだけで済みます。私はそれを取るよ、ありがとう! – arthur

+1

よろしくお願いいたします。 Javaのenum定義で列挙型の値の順序が変更されても、それは失敗しません。逆に、序数を使用してデータベースに書き込むintキーを決定し、誰かが列挙値の順序を変更すると、以前に格納されたデータを誤って解釈するという恐ろしいバグが導入されます。 – Adamski

1

列挙型には、序数(列挙型リスト内のインスタンスの位置)と名前の少なくとも2つのプロパティがあります。両方をデータベースに格納し、正しいenumインスタンスを取得するために使用できます。

もしあなたがHibernateのようなORマッパーを使っているなら、それを行うでしょう。さもなければ、enumを整数/ロングまたはストリングに手作業で変換する必要があります。

より安全にするには、enumにカスタムプロパティを追加し、getterとproperty-> enum値の変換関数を提供することができます。そうすれば、idプロパティを変更しない限り、列挙型の値を並べ替えたり名前を変更したりすることができます。

+0

Yepp、このアプローチは最速です。私はJDBCを使用し、Enumsの概念をサポートしていないアプリケーションコードにスキーマを移植したいのですが? – arthur

+1

@arthur私は "_あなたがORマッパーを使用しています..."と言っていたので、あなたはそれをする必要はありません。私は私の3番目の段落で説明したことをやっており、それはうまく動作し、Hibernateに依存する必要はありません。これはJDBCなどでも動作します。 – Thomas

+0

はい、確かに..ありがとう! – arthur

関連する問題