2016-10-27 3 views
2

Ich arbeite derzeit an einem Projekt, in dem ich eine MS SQL Server-Datenbank in Azure SQL-Datenbank neu erstelle. Ich habe das aktuelle Schema (wenn auch nicht mit dem tatsächlichen Spaltendatentyp) gegeben und ich kam in diesem:Speichern verschiedener Datentypen in einer Spalte, um die Anzahl der Tabellen zu reduzieren

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

So ist die Datenbank eine Vielzahl von Fragen enthält, die jeweils mit unterschiedlichen Arten von Daten beantwortet/gemessen (int, text, date usw.) und ALLE Antworten werden zusammen mit einer Spalte gespeichert, die den in der Spalte "Antwort" verwendeten Datentyp identifiziert.

Ich würde gerne wissen, ob dies eine gängige Praxis ist und wie dies umgesetzt werden kann? (Mehrere Arten von Daten in einer Spalte). Eine Alternative wäre natürlich, alle Fragen zusammen zu halten, aber die verschiedenen Antworten in verschiedene Tabellen aufzuteilen, aber ich kann sehen, wie das mit über 30 verschiedenen Fragen umständlich wird.

+1

Ich habe dies vorher getan gesehen. Die Angabe des Datentyps und der Skalierung (UnitOfMeasure) in der Antworttabelle ist jedoch keine gute Vorgehensweise. Es sollte nicht auf die Antwort repliziert werden, es ist bereits ein Teil der Frage. –

+0

Jeder Grund, warum nicht sql_variant verwenden? –

+1

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

Antwort

1

Dies ist ein Muster, das wir in der Produktion für die gleiche Art von Problem verwenden. Ja, es funktioniert - Sie müssen nur sicherstellen, dass jeder Answer tatsächlich zu dem gegebenen SQLDataType umgewandelt werden kann. Wir tun dies bei der Einfüge-/Aktualisierungszeit.

+0

Okay. Was wäre der standardmäßige Antwort-Datentyp für die Tabellenerstellung? Speichert die SQLDataType-Spalte nur den String-Namen des Datentyps? (I.e. 'int', 'varchar()', 'Datum') –

+0

Ja. Wir verwenden 'nvarchar' für beide. –

0

Möglicherweise können Sie sql_variant verwenden (die Dokumentation zu Azure ist nicht eindeutig).

Ein großer Vorteil ist, dass Sie keine Metadaten über die Werte pflegen müssen.

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 ║ 
╚══════════════════════════════════════╩══════════════════╩════╩═══╩════╩══════════════════════════════╩══════╝ 
Verwandte Themen