2016-10-27 84 views
2

我目前正在開發一個項目,在Azure SQL數據庫中重新創建MS SQL Server數據庫。我一直在考慮當前模式(雖然不是與實際列的數據類型),我碰到這個傳來:在一列中存儲不同的數據類型以減少表計數

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

因此,該數據庫包含了各種問題,其中每個都回答/與不同類型的數據測量(int,text,date等),所有的答案都與一個標識「答案」列中使用的數據類型的列一起存儲。

我想知道這是否是一種常見做法以及如何實施? (一列中有多種類型的數據)。另一種選擇顯然是把所有的問題放在一起,但把不同的答案分解到不同的表格中,但是我可以看到30多個不同的問題變得麻煩。

+1

我已經看到了這樣做過。但是將數據類型和比例(UnitOfMeasure)放入答案表中並不是一種好的做法。它不應該複製到答案,它已經是問題的一部分。 –

+0

任何爲什麼不使用sql_variant的原因? –

+1

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

回答

1

這是一種我們在生產中用於相同類型問題的模式。是的,它的工作原理 - 你只需要確保每個Answer都可以投射到給定的SQLDataType。我們在插入/更新時執行此操作。

+0

好吧。表創建的默認Answer數據類型是什麼? SQLDataType列是否僅存儲數據類型的字符串名稱? (I.e.'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 ║ 
╚══════════════════════════════════════╩══════════════════╩════╩═══╩════╩══════════════════════════════╩══════╝ 
相關問題