2016-10-27 7 views
2

現在、私はAzure SQLデータベースでMS SQL Serverデータベースを再作成するプロジェクトに取り組んでいます。私は(ないが、実際の列データ型で)現在のスキーマを与えられていると私はこれに出くわした:だから、データベースはそれぞれが/答え異なるタイプのデータを用いて測定されている質問の様々なが含まれてい 1つの列に異なるデータ型を格納してテーブルの数を減らす

Question (QuestionID, QuestionDescription, UnitOfMeasure, SQLDataType) 
QuestionAnswer (QuestionID, AnswerID, Answer, SQLDataType, UnitOfMeasure) 

(int、text、dateなど)とALL回答は、「回答」列で使用されるデータ型を識別する列とともに格納されます。

これは一般的な慣行で、これを実装する方法を知りたいと思いますか? (1つの列に複数のタイプのデータがあります)。選択肢は明らかにすべての質問をまとめておくことですが、さまざまな回答を別々のテーブルに分けていますが、どのように30以上の異なる質問でそれが厄介になるかを見ることができます。

+1

私は、これは前に行って見てきました。しかし、データ型とスケール(UnitOfMeasure)を回答テーブルに入れるのは良い方法ではありません。それは答えに複製されるべきではありません、それはすでに質問の一部です。 –

+0

sql_variantを使用しない理由は何ですか? –

+1

http://wiki.c2.com/?FearOfAddingTables –

答えて

1

これは、同じ種類の問題に対して本番で使用するパターンです。はい、それは動作します - それぞれAnswerが実際に指定されたSQLDataTypeにキャストできることを確認する必要があります。挿入/更新時にこれを行います。

+0

よろしくお願いします。テーブル作成のデフォルトのAnswerデータ型は何ですか? SQLDataType列にはデータ型の文字列名だけが格納されますか? (つまり、 'int'、 'varchar()'、 'date') –

+0

両方に 'nvarchar'を使います。 –

0

sql_variantを使用することができます(ドキュメントにはAzureについての説明はありません)。

大きな利点は、値に関するメタデータを維持する必要がないことです。

https://msdn.microsoft.com/en-us/library/ms173829.aspx https://msdn.microsoft.com/en-us/library/ms178550.aspx


create table t (val sql_variant); 

insert into t (val) values (123); 
insert into t (val) values (4.5); 
insert into t (val) values ('Hello'); 
insert into t (val) values (N'שלום'); 
insert into t (val) values (GETDATE()); 
insert into t (val) values (CURRENT_TIMESTAMP); 
insert into t (val) values (newid()); 

select  t.val 
      ,sql_variant_property(t.val, 'BaseType') 
      ,sql_variant_property(t.val, 'Precision') 
      ,sql_variant_property(t.val, 'Scale') 
      ,sql_variant_property(t.val, 'TotalBytes') 
      ,sql_variant_property(t.val, 'Collation') 
      ,sql_variant_property(t.val, 'MaxLength') 

from  t 
; 

╔══════════════════════════════════════╦══════════════════╦════╦═══╦════╦══════════════════════════════╦══════╗ 
║     123     ║  int  ║ 10 ║ 0 ║ 6 ║    NULL    ║ 4 ║ 
╠══════════════════════════════════════╬══════════════════╬════╬═══╬════╬══════════════════════════════╬══════╣ 
║ 4.5         ║ numeric   ║ 2 ║ 1 ║ 9 ║ NULL       ║ 5 ║ 
║ Hello        ║ varchar   ║ 0 ║ 0 ║ 13 ║ SQL_Latin1_General_CP1_CI_AS ║ 8000 ║ 
║ שלום        ║ nvarchar   ║ 0 ║ 0 ║ 16 ║ SQL_Latin1_General_CP1_CI_AS ║ 8000 ║ 
║ 2016-10-27 21:08:58.027    ║ datetime   ║ 23 ║ 3 ║ 10 ║ NULL       ║ 8 ║ 
║ 2016-10-27 21:08:58.030    ║ datetime   ║ 23 ║ 3 ║ 10 ║ NULL       ║ 8 ║ 
║ E0FBA251-8DC2-4F88-9D23-1FB354932AE5 ║ uniqueidentifier ║ 0 ║ 0 ║ 18 ║ NULL       ║ 16 ║ 
╚══════════════════════════════════════╩══════════════════╩════╩═══╩════╩══════════════════════════════╩══════╝ 
関連する問題