0

編集後:うわー、この質問は長くなります。許してください=\

30 を超える列で構成される新しいテーブルを作成しています。これらの列は、主にドロップダウン リストからの選択によって入力され、それらのオプションは主に論理的に関連しています。たとえば、[レビュー期間] というラベルの付いたドロップダウンには、[毎月]、[半年ごと]、[毎年] などのオプションがあります。月次、半年次、年次などの値を格納するプリミティブ ルックアップ テーブルを作成することで、これらのオプションを数値識別子に正規化する実行可能な方法を思いつきました。次に、これらのプリミティブの ID をレコードのテーブルに保存し、ビューを使用してそのテーブルをルックアップ テーブルに結合します。このビューを配置すると、外部アプリケーションと管理者がビューに対して SQL を実行し、わかりやすい情報に変換されたデータを返すことを許可しながら、レコードのテーブルにアプリケーションのみが理解できる生データを含めることができます。

複雑になっただけです。これらのドロップダウン リストには、論理的に関連のない項目が含まれるようになります。たとえば、[レビュー期間] ドロップダウン リストには、NA と手動のオプションが必要になりました。これにより、グループ化スキーム全体が水から吹き飛ばされます。

このアプリケーションで使用されている同様の構造は、複数のレコードにわたって繰り返される文字列値を格納することに頼っています。これは、テーブルの ReviewPeriod 列に格納された文字列 'Monthly' を持つ何百ものレコードを持つことができることを意味します。ここで働き始めて以来、このようなことが起こっていると考えると身がすくむようになりましたが、今では正規化されていないデータが最良の選択肢かもしれないと考え始めています。

最初の方法を使用してこれを行うことを考えることができる他の唯一の方法は、それを動的にし、いつでも任意のドロップダウン リストに新しいオプションを常に追加できるようにすることです。ビジネス オブジェクト (この場合は .NET クラス) のプロパティを調べて、プリミティブ テーブルに存在する文字列値を確認します。含まれていない場合は、それを追加して、テーブル オブ レコードに格納するための自動生成された一意の識別子を返します。とても複雑に思えますが、正規化されたデータのためにこれを行う必要がありますか?

4

2 に答える 2

2

Monthly、Semi-Annually、Yearlyなどの値を格納するプリミティブルックアップテーブルを作成することにより、これらのオプションを数値識別子に正規化するための実行可能な方法を思いつきました。次に、これらのプリミティブのIDをレコードのテーブルに格納し、ビューを使用してそのテーブルをルックアップテーブルに結合します。

テキストをID番号に置き換えることは、正規化とはまったく関係ありません。自然キーよりも代理キーの選択について説明しています。代理キーが良い選択である場合もあれば、代理キーが悪い選択である場合もあります。(多くの場合、あなたが信じているよりも悪い選択です。)

これは、テーブルのReviewPeriod列に文字列「Monthly」を含む数百のレコードを格納できることを意味します。私はここで働き始めて以来、このようなことが起こっていることを考えて頭がおかしくなりましたが、今では正規化されていないデータがここでの最良の選択肢かもしれないと考え始めています。

文字列「Monthly」を複数の行に格納することは、正規化とは何の関係もありません。(または非正規化を使用します。)これは、正規化が「すべてのテキストをID番号に置き換える」ことを意味するという概念に関連しているようです。データベースにテキストを保存しても、うんざりすることはありません。VARCHAR(n)が理由であります。

動的にし、いつでもドロップダウンリストに新しいオプションを追加することをサポートしながら、最初のメソッドを使用してこれを行うことを考えることができる他の唯一の方法は、次のとおりです。データベースにデータを保存するときは、すべてを繰り返します。ビジネスオブジェクト(この場合は.NETクラス)のプロパティを指定し、プリミティブテーブルに存在する文字列値を確認します。そうでない場合は、それを追加して、レコードテーブルに保存するための自動生成された一意の識別子を返します。

これについて少し非公式に考えてみましょう。

外部キーは参照整合性を提供します。それらの目的は、列で許可される値を制限することです。非公式には、参照されるテーブルは有効な値のセットを提供します。そのテーブルにない値は、他のテーブルの参照列では許可されていません。

ただし、ユーザーが何を入力しても、有効な値のテーブルに追加します。

ユーザーが最初に入力するすべてのものを受け入れる場合、なぜ外部キーを使用するのでしょうか。

ここでの主な問題は、リレーショナルモデルを教えてくれた(誤って教えてくれた)人々からのサービスが不十分だったことです。(そして、おそらく、SQLを教えてくれた人々によっても同様に貧弱です。)私は、あなたがそれらの誤った概念をすぐに学び直し、すぐに本当の進歩を遂げることができることを願っています。

于 2012-05-04T23:30:33.047 に答える
2

何でも可能です。誰もあなたを非正規化刑務所に連れて行き、あなたのDBAカードを取り消すつもりはありません。ルールとそれを破ることの意味を知っておくべきだと思います。それらを手に入れたら、あなたが最善だと思うことをするのはあなたとあなたの最善の判断次第です。

于 2012-05-04T18:15:50.547 に答える