ユーザーがSQLフィールドに提供するデータ型
-
11-07-2019 - |
質問
複数のフィールドを持つSQLテーブルがあります
ID |価値|タイプ
一般的なレコードは次のとおりです。 1000,10、[int]
2行目は次のようになります。-
1001、foo、[string]
3行目は次のようになります。-
1002,10 / 12/2008、[DateTime]
現時点では、この表から選択するたびに、指定された型に値をキャストする必要があるため、これを確認するように求められています。私はこれについてデータベースの再設計を行うことができ、これを最適化するための最善の方法を考えています。 (SQL 2000)。
解決
ホラー!これは恐ろしい Entity-Attribute-値(EAV)モデル!逃げろ!
しかし、真剣に、この種のモデルが必要な理由があると仮定して、各データ型に適切に型付けされた列を作成するかもしれませんか?
ID Type StringValue DateValue NumberValue
1001 String Foo
1002 Date 10/12/2008
1003 Number 123.46
他のヒント
一般に、テーブルを設計するとき、実際にテーブルに何が入っているかを知りたいです。サポートする必要があるデータ型の数は明確ですか?小数をカバーする必要がありますか?考えられる解決策の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値が等しい行のみを選択する必要があります。ただし、すべてのシナリオでテストを行ったわけではないので、何が機能して何が機能しないかを確認するために試してみてください。
もう一度言いますが、アプリケーションの設計をもう一度確認する必要があります。この種の機能に対する要件があることは確かに可能ですが、多くの場合、フロントエンドが本当に必要とするこのデザインパターンがアプリケーションに表示される文字列です。その文字列は、数字や日付のように見えることがあります。実際にデータに対してデータ型固有の機能を実行する場合は、「柔軟性」が低いと思われます。設計が求められていますが、あなたの要件のすべてを知らないと私は言うことができません。これは過去の私の経験からです。
編集:入力が遅すぎるように見え、トニーがそれに打ち負かした。 :)