リレーショナルデータベースで列挙型をどのように表す必要がありますか?


12

私は自分の会社で作業しているデバイスで発生するトランザクションを追跡するリレーショナルデータベースの開発に取り組んでいます。デバイスで発生する可能性のあるトランザクションにはさまざまなタイプがあるため、メインレコードテーブルの1つに「trans_type」フィールドがあります。私のグループは、このフィールドの型を整数にし、列挙型として扱うことにしました。私の直感では、このフィールドを文字列にしてデータベースのデータをより読みやすく使いやすくすることをお勧めします。私の同僚は、これが価値以上のトラブルを引き起こすのではないかと心配しているようです。文字列の比較はコストがかかりすぎるため、タイプミスの可能性はあまりにも大きな障壁です。

したがって、あなたの意見では、本質的に列挙値であるリレーショナルデータベースのフィールドを扱うとき、このフィールドを整数または文字列にする方が設計上の判断が優れていますか?または、私が見落とした他の選択肢はありますか?

注:明示的な列挙型は、使用しているデータベースではサポートされていません。そして、このデータベースとのインターフェースとなる開発中のソフトウェアはC ++で書かれています。


create tableのチェックされた型定義にするだけで長い間、他の誰かに打撃を与えますか?次のようなもの:CREATE TABLE hit(ip varchar(40)、ip_class ENUM(0、 "IPv4"、1、 "IPv6")); 順序または文字列(順序にマップする)で= <および>をチェックできるようにする必要があります。
dlamblin

回答:


26

列挙型は、ID番号と文字列名を含むデータベース内の独立したテーブルである必要があります。次に、各タイプがこのテーブルの行として存在します。次に、トランザクションを記録しているテーブルで、「trans_Type」フィールドはその参照テーブルのキーに対する外部キーである必要があります。これは、データベースの正規化の標準的な方法です。

このようにして、1つの正式名の文字列を保存し、パフォーマンスのために数値比較を使用し、すべてのトランザクションに有効な型があるという参照整合性を確保します。


1
はい。「O」を「Open」に変更する場合は、1行だけ変更する必要があります。
ダニエルカプラン

+1。リレーショナルデータベースで列挙型を表すには、単純なint / stringテーブルが最適な方法です。
mike30

おそらく、Javaソリューションを探している次回の訪問者が見つけることが便利
Jauhien

2
この。追加のクレジット-開発チームがJava / C#列挙型などで整数を定義している場合、コード列挙型の定義がルックアップテーブルと異なるかどうかを確認するテストを作成できます。シーケンス外の要素を追加すると、同期がとれなくなる可能性が常にあり、ライブデータレコードが間違っているように見えるまで気付かない危険が常にあります。
ジュリアヘイワード

4

一般的な方法は、trans_typesテーブルを作成し、メインテーブルにという名前の外部キーで参照させることtrans_type_idです。これにより、レコードは有効な列挙型のみを参照するようになります。

例:

trans_type
----------
  id
  名前

取引
------------
  id
  trans_date
  詳細
  trans_type_id(trans_type.idへのFK)

サンプルデータ:

trans_type

ID | 名前
----------
1 | 参加する
2 | キャンセル


取引

ID | trans_date | trans_type_id
---------------------------------
1 | 2012-12-31 | 1
2 | 2013-01-09 | 2

3

値が整数としてデータベースに入力される場合は、そのように保存します。データベースへの書き込み中に文字列に変換するオーバーヘッドをかける必要はありません。文字列/テキスト値を使用して、いつでもルックアップテーブルに関連付けることができます(More Normalized)。

これには、何らかの更新ルーチンを実行する代わりに、単一の場所で文字列値を更新するという追加の利点があります。1 = 'Red'の代わりに 'Really Red'に等しくなる可能性があります

これは、文字列値(非正規化)を持つ1つのテーブルのみが必要な場合と比較して、パフォーマンスのレポートには理想的ではありません。このフィールドのインデックスは、パフォーマンスを十分に向上させます。

ほとんどのRDBMSは十分な馬力を許可します。テーブルをプレーンなデータ形式で「読み取る」ことができるというあなたのアイデアですが、テーブルに参加することは大したことではありません。ビューなどのオブジェクトを使用する習慣を身に付けてください。


2

個別の列挙テーブルアプローチを提唱するこの質問に対する他の回答には同意しません。

ただし、私は確かに既に言われたことを繰り返さないことを支持しているので、Stack Overflowの同じ質問(多かれ少なかれ)への受け入れられた答えを単に参照します:https//stackoverflow.com/a/229919 / 114626


リンクされた回答に対して+1。この質問では、リンクされた回答が正しいようです。ただし、質問者が列挙型の柔軟性を必要とする場合はもちろん、参照テーブルの方がはるかに優れています。
ハーケ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.