2009-09-02 10 views
5

整数(または任意の数値データ型)に対してDBレイヤの(Javaの)列挙型(定数の固定セット)を表現するためのパフォーマンスと "可読性/優れたコーディングスタイル"の点で最も優れたソリューションは何ですか?文字列表現。データベース(INT対VARCHAR)で定数(列挙型)を表現するにはどうすればいいですか?

警告: "Enums"を直接サポートするデータベースシステムがいくつかありますが、これはビジネス層実装と同期してDatabase Enum-Definitionをキーする必要があります。さらに、この種のデータ型は、すべてのデータベースシステムで利用できるわけではなく、構文も異なる可能性があります。>すべてのデータベースシステムで簡単に管理できる使いやすいソリューションを探しています。 (したがって、私の質問は、数値と文字列の表現のみを扱っています。)

数値の表現は非常に効率的です(例えば、整数として2バイトしか消費しません)。インデックス作成に関しては非常に高速です

文字列表現は読みやすく(「0」および「1」と比較して「有効」および「無効」が格納されていますが)、読みやすくなります多くの記憶空間を消費し、索引付けに関しては最も遅い可能性が最も高い。

私の質問は、いくつかの重要な面を欠場しましたか?データベース層の列挙表現に使用することをお勧めします。

ありがとうございました!

+0

正確な複製:http://stackoverflow.com/questions/229856/ways-to-save-enums-in-database – ChssPly76

答えて

3

ほとんどの場合、短い英数字コードを使用して、展開されたテキストを含むルックアップテーブルを使用することをお勧めします。必要に応じて、データベーステーブルからプログラム内の列挙型テーブルを動的に構築します。

例えば、トランザクションタイプを含むフィールドがあり、可能な値はSale、Return、Service、Layawayです。私はコードと説明でトランザクションタイプテーブルを作成し、コードを "SA"、 "RE"、 "SV"、 "LY"とし、コードフィールドを主キーとして使用します。その後、各トランザクションレコードで、そのコードを投稿します。これは、レコードそのものとインデックスの整数キーよりも少ないスペースしか必要としません。それがどのように処理されるかは、データベースエンジンに依存しますが、整数キーよりも劇的に効率が低下しません。それはニーモニックであるため、使い方が簡単です。レコードをダンプして、値が何であるかを簡単に確認し、どのレコードがどれであるかを簡単に確認できます。翻訳なしでユーザーの出力にコードを表示することができ、ユーザーはそれらを理解することができます。これは、整数キーに比べてパフォーマンスが向上します。多くの場合、省略形はユーザーには便利です。表示をコンパクトにしてスクロールを避けるために省略記号を使用することが多いため、トランザクションテーブルに参加する必要はありません翻訳を得る。

私は間違いなくすべてのレコードに長いテキスト値を格納しません。この例のように、私はトランザクションテーブルを使い果たして「棚上げ」を保管したくないでしょう。これは非効率的であるだけでなく、いつかはユーザーが "Layaway sale"に変更したい、あるいは "Lay-away"のような微妙な違いに変更したいと言うことは間違いありません。その後、データベース内のすべてのレコードを更新するだけでなく、このテキストが出現する場所ごとにプログラムを検索して変更する必要があります。また、テキストが長くなればなるほど、プログラマがライン上のどこかでそれを間違って綴る可能性が高くなり、あいまいなバグが作成される可能性が高くなります。

また、トランザクションタイプテーブルを持つと、トランザクションタイプに関する追加情報を保存するのに便利な場所が提供されます。 「whatevercode = 'A'やwhatevercode = 'C'やwhatevercode = 'X'なら...」というコードを書くことは決してありません。それが何であれ、これらの3つのコードは他のコードとは何とか違っています。それはトランザクションテーブルにあり、そのフィールドをテストします。 「まあ、それらはすべて税関連のコードです」と言った場合、「tax_related」というフィールドを作成し、各コード値に対して適切な値をtrueまたはfalseに設定します。それ以外の場合、誰かが新しいトランザクションタイプを作成するときには、それらのすべてのものを見て、どのタイプのものを追加すべきか、どのタイプを追加すべきでないのかを判断する必要があります。私は、これらの3つのコード値にいくつかのロジックが適用されているが、他にはない理由を理解しなければならなかったたくさんの難解なプログラムを読んだ。そして、リストに4番目の値を含めるべきだと思うとき、プログラマが間違いを犯した場合、実際には何らかの形で異なっているために行方不明になります。

私が変換テーブルを作成しない唯一のタイプは、リストが非常に短く、保存する追加のデータがない場合です。ユニバースの性質から、変更する可能性は低いことが明らかです値を安全にハードコーディングできます。真/偽、肯定/否定/ゼロ、男性/女性のように。 (そして、ちょっと最後のものでさえ明らかに、 "トランスジェンダー"などを含むと主張する人々がいる)

いくつかの人々は、あらゆるテーブルには自動生成された連続整数キーがあると主張する人もいる。このようなキーは多くの場合優れた選択ですが、コードリストの場合は、上記の理由で短いアルファキーが好まれます。

1

これは、列挙型に戻って相関が取れやすく、より安定しているため、文字列表現を格納します。 ordinal()を使うのは、シリーズの途中に新しいenumを追加すると変更される可能性があるので、あなた自身のナンバリングシステムを実装する必要があります。

パフォーマンスに関しては、すべてが列挙型の使用に依存しますが、自然な文字列表現を使用するのではなく、変換を伴う完全な別個の表現を開発するのが時期尚早の最適化です。

関連する問題