1

いくつかのフィールドを持つ SQL テーブルがあります

ID | 値 | タイプ

典型的なレコードは次のようになります:- 1000,10,[int]

2 番目の行は次のようになります。

1001、フー、[文字列]

3 番目の行は次のようになります。

1002,10/12/2008,[日時]

現時点では、このテーブルから選択するたびに、指定された型に値をキャストする必要があるため、これを確認するように依頼されました。これでデータベースの再設計を行うことができ、これを最適化するための最善の方法を考えています。(SQL 2000)。

4

2 に答える 2

3

恐怖!これは恐ろしいエンティティー属性値 (EAV)モデルです! 逃げる!

しかし真剣に、この種のモデルが必要な何らかの理由があると仮定すると、データ型ごとに適切に型指定された列を作成するのでしょうか?

ID       Type      StringValue       DateValue      NumberValue
1001     String    Foo
1002     Date                        10/12/2008
1003     Number                                     123.46
于 2008-11-26T13:10:34.480 に答える
2

一般に、テーブルを設計するときは、実際にテーブルに何が含まれるかを知りたいと思います。サポートする必要のあるデータ型の数は明確ですか?小数をカバーする必要がありますか?考えられる解決策の1つは、次のようなものです。

CREATE TABLE dbo.My_Table (
     id           INT NOT NULL,
     data_type    VARCHAR(10) NOT NULL,
     string_value VARCHAR(100) NULL,
     int_value    INT NULL,
     date_value   DATETIME NULL,
     CONSTRAINT CK_My_Table_data_type CHECK data_type IN ('int', 'string', 'datetime'),
     CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id)
)
GO

次に、データ型を使用して、選択または挿入/更新する列を決定できます。ただし、以下の使用で問題が発生する可能性があることに注意してください。

SELECT
     id,
     CASE data_type
          WHEN 'string' THEN string_value
          WHEN 'int' THEN int_value
          WHEN 'datetime' THEN date_value
          ELSE NULL
     END

SQL Serverでは、返される列のデータ型がすべて一致している必要があります。一度に1つしか選択しない場合は問題なく機能する可能性がありますが、データセットを選択する場合は、とにかくキャストを行うか、data_type値が等しい行のみを選択する必要があります。ただし、すべてのシナリオでテストを行ったわけではないので、テストを試して、何が機能し、何が機能しないかを確認する必要があります。

ただし、もう一度言いますが、アプリケーションの設計をもう一度確認する必要があります。この種の機能が必要な可能性は確かにありますが、このデザインパターンを見ると、フロントエンドが本当に必要としているのは、アプリケーションに表示される文字列であることがよくあります。その文字列は、たまたま数字や日付のように見えることがあります。実際にデータに対してデータ型固有の機能を実行する場合は、「柔軟性の低い」設計が求められる可能性がありますが、すべての要件を知らなければ、私には言えません。これは過去の私の経験からです。

編集:私が入力するのが遅すぎるようで、トニーは私をそれに打ち負かしました。:)

于 2008-11-26T13:21:27.003 に答える