列挙型の使用と永続化のためのベストプラクティス
質問
ここで、enum のような値 (例えば、enum.exe) を処理し、持続させるための最良の方法に関するいくつかの質問/議論を目にしました。 列挙型に適したデータの永続化 , NHibernateを使用してenumを永続化する方法 を参照してください)、そして私は一般的な同意が何であるかを尋ねたいと思います。
特に
- これらの値は、コード内でどのように扱われるべきでしょうか?
- どのようにデータベースに永続化させるか(テキストとして/数値として)?
- 異なるソリューションのトレードオフは何ですか?
注: この質問に元々含まれていた説明を回答に移動しました。
どのように解決するのですか?
私の理解をまとめてみました。もし訂正があれば、遠慮なく編集してください。それでは、どうぞ。
コードの中で
コード中では、enumは言語固有のenum型(少なくともJavaとC#では)を使って処理するか、あるいは、enum型と同様に typeafe enum pattern" . 型安全性が失われる(そして、どの値が例えばメソッドのための正当な入力であるかを理解するのが難しくなる)ので、普通の定数(Integerまたは類似)を使用することは推奨されません。
これらの2つの選択は、どの程度の追加機能がenumに添付されるかに依存します。
- もし、enum に機能の負荷を置きたいなら (それは良いことで、常に switch() することを避けるためです)、クラスが通常より適切です。
- 一方、単純なenumのような値の場合、言語のenumは通常より明確です。
特に、少なくともJavaではenumは他のクラスから継承できないので、似たような動作をするenumが複数あり、それをスーパークラスに入れたい場合、Javaのenumは使えません。
列挙型の永続化
列挙型を持続させるために、各列挙型の値には一意の ID を割り当てる必要があります。これは整数か短い文字列のどちらかです。短い文字列は、ニモニック(DBAなどがデータベース内の生データを理解しやすくなる)であるため、好ましいです。
- ソフトウェアでは、すべての列挙型は、列挙型(ソフトウェア内部で使用)とID値(永続化用)の間で変換するためのマッピング関数を持つ必要があります。いくつかのフレームワーク (例: (N) Hibernate) には、これを自動的に行うための限定的なサポートがあります。そうでなければ、enum 型/クラスにそれを置く必要があります。
- データベースは、(理想的には) 各 enum に対して、有効な値をリストしたテーブルを含むべきです。1 つのカラムは ID (上記参照) であり、これは PK となります。追加のカラムは、例えば、説明のために意味をなすかもしれません。そのenumからの値を含むすべてのテーブルカラムは、この "enumテーブル"をFKとして使用することができる。これにより、不正な enum 値が決して永続化されないことが保証され、DB を自立させることができます。
このアプローチの 1 つの問題は、合法な enum 値のリストが 2 つの場所 (コードとデータベース) に存在することです。これは回避するのが難しいため、しばしば許容範囲と見なされますが、2 つの選択肢があります。
- DB に値のリストのみを保持し、構築時に列挙型を生成します。エレガントですが、ビルドを実行するために DB 接続が必要であることを意味し、問題があると思われます。
- コード内の値のリストを権威あるものとして定義する。実行時 (通常は起動時) に DB 内の値と照合し、不一致の場合は警告/中止を表示します。
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】aspNetCore 2.2.0 - AspNetCoreModuleV2 エラー
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] enumとは何か、なぜ有用なのか?
-
[解決済み】.NETの例外をキャッチして再スローするためのベストプラクティス
-
[解決済み] C#のenumとマッチングプロパティの命名規則
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] 1つ以上のエンティティで検証に失敗しました。詳細は'EntityValidationErrors'プロパティを参照してください [重複]。
-
[解決済み】コンパイルエラー「未割り当てのローカル変数を使用しています」が発生したのはなぜですか?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Moqを使用してメソッド呼び出しを検証する
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?