7

Orableデータベースで目覚め、ルックアップテーブルをいくつか追加しています。

一般的な質問は、ルックアップテーブルにコードと説明が含まれ、コードがメインテーブルに戻るFKであるか、ルックアップテーブルに説明のみが含まれ、メインテーブルに戻るFKであるかです。

私はコード/説明のペアについて議論しています。私が持っていtype = Contractorcode = CN、ストアドプロシージャがある場合は、コードwhere type='CN'がなく、ストアドプロシージャでこれを言うのではなく、次のように言う必要があると思います。次に、ストアドプロシージャを変更する必要があります。私はこれをする必要はないと感じています。(ストアドプロシージャの変更には、開発での再コンパイル、テストへの移行、クライアントによる再テスト、および2週間の待機期間を伴う変更管理プロセスを経る必要がある製品の移行が必要です。一方、テーブルのレコードの変更には、これの)type=Contractorwhere type='Contractor'General ContractorContractor

私のデータモデラーは説明だけを使用したいと思っています。彼の主な議論は、それは不必要な参加を必要とするだろうということです。

どちらの方法で行う必要がありますか?そして、もしコード/記述の方法で行われるべきなら、どうすればデータモデラーを説得できますか?

ありがとう!

type_cd    type_dsc
CN         Contractor
IN         Inspector
4

8 に答える 8

13

すべての答えを要約すると、ルックアップテーブルには4つの選択肢があると思います。

代替案1:
•説明(主キー、より長いvarchar2列)

代替案2:
•コード(主キー、短いvarchar2列)
•説明(nullではない、長いvarchar2列)

代替案3:
•Id(意味のない主キー、シーケンスから派生した整数値)
•説明(nullではなく、より長いvarchar2列)

代替案4:
•Id(意味のない主キー、シーケンスから派生した整数値)
•コード(一意のキー、短いvarchar2列)
•説明(nullではない、長いvarchar2列)

主キー列はメインテーブルにあり、外部キー制約が上にあります。

代替案ごとのいくつかの特徴:

代替案1:
•メインテーブルのクエリ時に結合は必要ありません•メインテーブル
でアドホッククエリを実行する場合の明確な意味•メインテーブル
により多くのストレージが必要です•メインテーブルの
インデックスは他の代替案よりもはるかに大きくなり
ます•説明値の更新メンテナンスの問題と、場合によってはアプリケーションのダウンタイムを意味します。

代替案2:
•説明値を取得する場合は結合が必要です
。•特定のルックアップ値でフィルター処理する場合は結合は不要です。そのためのコード値を使用できます。
•メインテーブルでアドホッククエリを実行する場合の非常に明確な意味•メインテーブルの
最小限の追加ストレージ要件
•メインテーブルのインデックスは小さくなります。
•Description値の更新は簡単ですが、コードは通常、descriptionの省略形です。Description値を更新すると、コードが混乱する可能性があります。

代替案3:
•説明値を取得する場合は結合が必要です
•特定のルックアップ値でフィルタリングする場合、IDは無意味であるため、クエリで説明値を使用する必要があります。
•メインテーブルでアドホッククエリを実行する場合の意味が明確ではありません
•メインテーブルの追加ストレージ要件が最小限に抑えられます
•メインテーブルのインデックスが小さくなります。
•説明値の更新は簡単で、コード値のように混乱を招くことはありません

代替案4:
•説明値を取得する場合は結合が
必要です。•特定のルックアップ値でフィルタリングする場合は結合が必要です。ルックアップテーブルのコード値を使用します。
•メインテーブルでアドホッククエリを実行する場合の意味が明確ではありません•メインテーブル
の追加ストレージ要件が最小限になります
•メインテーブルのインデックスが小さくなり
ます•説明値の更新が簡単で、コード値も非常に簡単に更新できます。 Descriptionの値に似せてください。ただし、これを行うときは、コードの一部を再検討する必要があるかもしれません。

個人的な意見:

メインテーブルとルックアップテーブルをどのように使用する予定かを見ていきます。どのクエリが重要で、効率的に実行する必要がありますか?値は変更されますか?

私の個人的な選択は、代替案2または4です。コード値が決して変更されないことが絶対に確信できる場合は、代替案2を使用します。そして、これはまれです。国コードが変更され、社会保障番号が変更されます。通貨コードの変更など。したがって、ほとんどの場合、代替4を選択します。特にルックアップテーブルが小さなテーブルであるため、余分な結合についてはそれほど心配していません。

ただし、要件に合った代替手段を選択してください。

代替案の特徴がわかったら、テキストを自由に編集してください。

よろしく、
ロブ。

于 2011-02-10T13:25:19.527 に答える
5

コード/説明。そのコード値は (私が推測するに) より小さく、より効率的な整数になります。さらに、将来のある時点でテキスト記述が変更されるという理由だけで、すべての外部キーを更新する必要がある状況にはなりたくありません。

編集: 追加したサンプル コードに基づいて、コード値を「CN」、「IN」などの文字列ではなく整数値にすることをお勧めします。説明に関連付けられた「意味」にとらわれないキー値が必要です。「CN」は引き続き「請負業者」を意味し、その説明が「外部リソース」に変更された場合、「CN」は誤解を招く可能性があります。

于 2011-02-09T14:38:13.493 に答える
4

多くのことについて既存の標準とエンコーディング スキームがあり、それらは私より頭が良く、それについて考える時間がたくさんある人々によって考え出されました。たとえば、ISO 標準は、性別コード (iso 5218)、国コード (iso 3166)、言語コード (iso 639)、通貨コード (iso 4217) などをカバーしています。昨年、Joe Celko の Data, Measurements and Standards in SQLを購入しましたが、公式に維持されている既製の標準とエンコーディング スキームが数多く存在することに本当に驚きました。

わかりました。それで、たまにある国がバナナを放棄して EUR/USD を支持し、今度はアプリケーション全体を書き直さなければなりませんか? いいえ、変更されたコードが何であれ、マージ/分割するスクリプトを書くのに数時間を費やす必要があります。大したこと。同じリリース中にいくつかのバグを修正してみませんか?

個人的には、コードを記述しなければならないほとんどすべての場合、または何らかの「型コード」に応じて動作を割り当てる必要がある場合に、短い文字コードを使用します。コードは型コードと密接に結びついているのに、なぜ必要以上に難しくする必要があるのでしょうか? 結果のコードは読みやすくなり、必要な結合が少なくなるため、実行速度も速くなります。他のすべて (基本的にはすべてユーザー生成) については、整数サロゲートを使用します。

私は 11 年間データベースを「のみ」使用してきましたが、「名前が大幅に変更」されてコードが誤解を招くようなケースはあまり見たことがありません。「請負業者」の種別コードは、「人事部長」や「副社長」に変更することはできません。それが新しいコードです。「内部/外部リソース」に分割される可能性がありますが、コードの変更も必要になります。その場合、プロジェクトの予算に数時間のデータ変換を追加しても問題はありませんか?

最後に、ある時点で、コードに入力した値にコミットする必要があります。任意の値を使用できますが、意味は同じです

私は次のすべてを見てきました:

where type = 1 /* contractor */ 
  vs

int type_code = configfile.lookup("sqlcodes.contractor");
...
where type = :type_code
  vs

 from sometable
 join contract_types using(type_id)
where contract_types.type_name = 'Contractor';

...しかし、私はまだ以下の利点を見ていません:

where type = 'CN'

私が言おうとしているのは、開発に 80 時間を費やしている場合、4 時間のデータベース作業がプロジェクトの予算に収まらないということです。

于 2011-02-09T22:48:18.410 に答える
4

まあ、これはそれらのコードがどれほど「標準的」であるかによって異なります。

次のようなルックアップ テーブルを考えてみましょう。

Code  Description
------------------
USD   United States Dollar
GBP   Pound Sterling
AUD   Australian Dollar
EUR   Euro

このためchar(3)に、 for を使用して、Codeそれを主キーにします。あなたのコードは char(2) のようです - きれいで小さいです。整数より小さい。

Codeしたがって、ルックアップ テーブルの PK として を使用し、「メイン テーブル」はルックアップ テーブルの FK として使用することになると思いCodeます。

また、コードがあまり標準的ではなく、変更される可能性がある場合は、整数が優先されます。

于 2011-02-09T15:43:59.087 に答える
2

変更されないニーモニック(例:請負業者のCNなど)を使用します。UIに説明を表示させます。小さなコードテーブルはおそらく1つまたは2つのブロックに収まるため、通常はキャッシュ内にあるため、ルックアップは安価になります。

最も重要なことは、後で来てこのデータを他のシステムにマップする必要がある将来の開発者や人々(私のような)があなたに感謝することです。これは、80%の時間、テーブルにクエリを実行して直感的に理解できることを意味します。

私がこのようなテーブルを見るとき、私はただ叫びたいです:

ADDRESS_ID
HOUSE_NUMBER
STREET_NAME
STREET_TYPE_ID
LOCALITY_ID

SELECT * FROM addresses WHERE street_type_id = 10053;

コードを変更する必要はありません(コードはシステムの内部にあるため、エンドユーザーには表示されません)。説明は時々変更されますが、通常はそれほど大きくはありません。説明が大幅に変更されてニーモニックが意味をなさなくなった場合は、私の経験では非常にまれです。

于 2011-02-10T05:04:43.067 に答える
2

数値 ID 値と説明を使用します。id をメイン テーブルに FK として格納します。

文字列はお粗末な FK 値であり、基本的な正規化は、データ モデラーに、ルックアップ テーブルで一度文字列を変更する柔軟性が必要であり、参照されている場所で変更する必要がないことを伝えます。

于 2011-02-09T14:38:18.570 に答える
1

キーの分布に応じて、ほとんどの小さなルックアップテーブルの場合、それに結合するクエリはルックアップに対して全表スキャンを実行し、とにかくキーをハッシュ結合します。したがって、数値と文字は、パフォーマンスにとっておそらく完全に問題ではありません。参加します。

問題は本当にです-あなたは参加する必要がありますか?

つまり、UIで表示値として使用するルックアップを保存している場合は、ルックアップを使用してそれに結合することで、表示値を簡単に更新できます。

一方、多言語アプリのリソースファイルを使用していて、返されたコードをルックアップとして使用していて、変更が予想されない小さなコードセットである場合(Gender_Code='M'aleまたは'たとえば、F'emaleまたは'U'nknown)-次に、コードを意味のあるものにし、フィールドでチェック制約を使用して値を制御します。コードとUIでそれらを知っているので、ルックアップテーブルを気にする必要はありません。それらを表示する方法を理解します。

于 2011-02-09T17:44:05.473 に答える
0

私の提案は、int ID と char/varchar の説明を使用することです。

クエリで ID を使用し、説明を表示する必要がある場合にのみ説明にリンクします。

ID が説明のように見えなくても心配しないでください。これが機能するはずの方法です。「CH」や「EX」などの意味を誰も推測できないように、重要でない ID が必要です。ID の意味を説明するコメントをコードに追加します。

コードを壊すことなく、いつでも説明を変更できるようにしたいと考えています。コードが変更されたときにすべてのコードを修正する必要はありません。

また、説明テーブルに 1 つ以上のグループを追加することもできます。複数の請負業者タイプがある場合は、タイプを示すグループ列を追加できます。次に、グループの説明テーブルにリンクして、グループが請負業者であるすべての行を返すことができます。もちろん、このグループには ID と説明を含むルックアップ テーブルが必要なので、ルックアップ グループの表示名を変更できます。

関連するテーブルにデータを配置することをデータ モデラーに伝えます。そのため、リレーショナル データベースと呼ばれます。

于 2011-02-09T20:06:05.650 に答える