質問

複数のフィールドを持つ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値が等しい行のみを選択する必要があります。ただし、すべてのシナリオでテストを行ったわけではないので、何が機能して何が機能しないかを確認するために試してみてください。

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

編集:入力が遅すぎるように見え、トニーがそれに打ち負かした。 :)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top