SQLフィールドにユーザーが指定したデータ型

entity-attribute-value sql sql-server tsql

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

ID |値|タイプ

一般的なレコードは次のとおりです。 – 1000,10、[int]

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

1001、foo、[string]

3行目は以下のようになります。

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

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

  1  0


ベストアンサー

恐怖! これは恐ろしい Entity-Attribute-Value(EAV)モデルです。 逃げる!

しかし、真剣に、この種のモデルが必要な理由がいくつかあると仮定して、各データ型に対して適切に型指定された列を作成します。

IDタイプStringValue DateValue NumberValue 1001 String Foo 1002日付10/12/2008 1003番号123.46

3


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

CREATE TABLE dbo.My_Table(ID INT NULL以外、data_type VARCHAR(10)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プライマリキークラスタ(id))GO

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

SELECT ID、CASEデータ型WHEN 'string' THEN string_value WHEN 'int' THEN int_value WHEN 'datetime' THEN date_value ELSE NULL END

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

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

編集:私はあまりにもゆっくりタイプし、トニーはそれに私を打ち負かしたように見える。 🙂

2


タイトルとURLをコピーしました