1

私は3つのテーブルを持っています

結果: TestIDTestCode値

テスト: TestID TestType SysCodeID

SystemCodesSysCodeIDParentSysCodeID 説明

私が持っている質問は、ユーザーが結果テーブルにデータを入力しているときです。

testCodeのタイプがSystemListの場合、行がフォーカスを取得したときのフォーマットコードは、値フィールドをドロップダウンコンボボックスに変更します。ドロップダウンには、test.SysCodeIDのparentsyscodeIDを持つすべてのシステムコードのリストがあります。ユーザーがリストで値を選択すると、値フィールドに入力される数値に変換されます。

Results.Valueフィールドのデータ型は整数です。報告するときに計算や並べ替えが数値の方が簡単なので、文字列ではなく整数にしました。文字列フィールドに整数/小数の値を入力する場合は問題があります。同様に、システムが設計されていたとき、彼らはそこに数字だけが欲しかったのです。

ユーザーは、リストの数値/値だけでなく、値フィールドにも文字列を入力したいと考えています。そのための最善の方法は何でしょうか。


フィールドを文字列に変換してから、文字列と整数の両方を同じフィールドに格納するのは悪い習慣ですか?これに関連するさまざまな問題がありますが、本当に大きな問題があるかどうかはわかりません。

文字列データ型のテーブルに別の列を追加する必要があります。テストが文字列型の場合は、ユーザーが入力したデータを別のフィールドに入力します。

別のオプションは、別のテーブルと1-1の関係を作成し、ユーザーが値フィールドに文字列を入力すると、数値のキーを使用して新しいテーブルに追加することです。

面白いアイデアはありますか?

4

8 に答える 8

2

Results.Value を、ValueCode とそれに一致する文字列を含む別のテーブルを参照する外部キーになる数値の ValueCode であるかのように扱うのはどうでしょうか。

CREATE TABLE ValueCodes
(
    Value     INTEGER NOT NULL PRIMARY KEY,
    Meaning   VARCHAR(32) NOT NULL UNIQUE
);

CREATE TABLE Results
(
   TestID     ...,
   TestCode   ...,
   Value      INTEGER NOT NULL FOREIGN KEY REFERENCES ValueCodes
);

引き続き整数を保存しますが、これらは ValueCodes テーブル内の限定された値のセットへの参照です。既存の値のほとんどは、同じ値「100」を表す文字列を持つ 100 などの整数として表示されます。必要に応じて新しいコードを追加できます。

于 2009-04-04T00:42:58.077 に答える
2

彼らは自由形式のテキスト入力をしたいと言っているのですか? その場合、フィールドで意味のあるレポートを作成する機能が台無しになります。文字列を一貫して入力しないことが保証できるからです。

事前に設定されたいくつかの文字列 (たとえば、A、B、C などの成績) の 1 つを入力する場合は、これらの文字列のルックアップ テーブルを作成し、並べ替え、評価、平均化などのために数値にマップします。

彼らが本当に自由形式のテキストを入力できるようにしたいと思っていて、それを思いとどまらせることができない場合は、other_entry の行に沿って別の列を追加します。値の列に入力する「その他」を意味する定義済みの値を用意します。そうすれば、レポートを作成するときに、これらのランダムな「その他」の値をすべてロールアップするか、単純に無視することができます。SystemCodes テーブルに「other」を追加して、それと Results テーブルの間に外部キーを保持できるようにしてください。まだ持っていない場合は、必ず追加することを検討してください。

幸運を!

于 2009-04-02T18:08:32.760 に答える
1

ユーザーは、文字列を値フィールドに入れたいだけでなく、リストの数値/値も入れたいと思っています。それを行う最善の方法は何でしょうか。

ユーザーが新しい「testCodes」を追加したいようです。その場合は、それらを既存のテストコード テーブルに追加して、既存の形式を保持するだけではどうですか。

フィールドを文字列に変換してから、文字列と整数の両方を同じフィールドに格納するのは悪い習慣でしょうか? これに関連するさまざまな問題がありますが、本当に大きな問題があるかどうかはわかりません。

いいえ、大したことではありません。多くの場合、PO 番号または請求書番号には、数字または文字と数字の組み合わせが含まれています。ただし、文字列ではなく数値フィールドでのデータベースのパフォーマンスについては正しいですが、文字列フィールドにインデックスを付けると、とにかくデータベースが数値インデックスでスキャンを実行することになります。

文字列としての小数で発生した可能性がある問題は、サーバーが基本的にフィールドの値を推定し、特定の桁数までの精度のみを保持する浮動小数点データ型に関係している可能性があります。これにより、桁数が気になる場合、多数の丸め誤差が発生する可能性があります。小数の静的な精度を持つ通貨フィールドなどを使用することで、この問題を回避できます。笑私はこれを難しい方法で学びました。

Tom H. は他のすべてに対処する素晴らしい仕事をしました。

于 2009-04-03T23:26:38.027 に答える
0

これを行う最も簡単な方法は、Results.Value を「文字列」(char、varchar など) に変換することだと思います。はい、これは数値の並べ替えを行う機能を台無しにします (そして、テキストが整数値と混ざり合うため、列でキャストまたは変換を行うことができなくなります)、しかし、他の方法は複雑すぎて実行できないと思います適切に維持します。(たとえば、あなたが言及した1-1の場合、その整数値は実際の値ですか、それとも文字列テーブルへの外部キーですか?それを判断するために別の列が必要です。)

于 2009-04-02T16:46:31.583 に答える
0

文字列値用の追加の列を作成します。これは真の正規化ではありませんが、実装と操作が最も簡単です。

数値と文字列の両方に同じフィールドを使用することは、合計や並べ替えなどの数値で何もする予定がない限り機能します。

追加のテーブル アプローチは、正規化の観点からは優れていますが、おそらく過度に複雑です。

于 2009-04-02T16:47:08.760 に答える
0

値フィールドを文字列に変換し、後処理とレポートのためにどのデータ型を扱うべきかを示す列を追加します。

于 2009-04-02T16:51:27.937 に答える
0

2 つの解決策のうちの 1 つが思い浮かびます。それはあなたが数字で何をしているかに依存します。それらが何らかの選択を表しているだけの場合は、いずれかを選択してください。計算(ソート、変換など)が必要な場合は、別のものを選択してください。

  1. 列を varchar に変更してから、数値またはテキストを挿入します。数値で並べ替えるのは面倒ですが、ねえ、それは 1 つの列です。

  2. テキスト用の varchar 列と数値用の int 列の両方があります。ビューを使用して差異を非表示にし、必要に応じて並べ替えを制御します。数字とテキストのどちらを見ているかを気にしない場合は、2 つの列を合体させることができます。

于 2009-04-02T18:10:34.567 に答える
0

Sql Server には、少なくとも使用できる IsNumeric 関数があります。

ORDER BY IsNumeric(Results.Value) DESC, 
         CASE WHEN IsNumeric(Results.Value) = 1 THEN Len(Results.Value) ELSE 99 END,
         Results.Value
于 2009-04-02T16:55:30.847 に答える