2012-02-09 11 views
98

Qual è il miglior tipo di dati SQL per la memorizzazione della stringa JSON?Qual è il miglior tipo di dati SQL per la memorizzazione della stringa JSON?

static List<ProductModel> CreateProductList() 
{ 
    string json = @"[ 
     { 
      ProductId: 1, 
      ProductCode: 'A', 
      Product: 'A' 
     }, 
     { 
      ProductId: 2, 
      ProductCode: 'B', 
      Product: 'B' 
     } 
    ]"; 

    IList<JToken> tokenList = JToken.Parse(json).ToList(); 
    List<ProductModel> productList = new List<ProductModel>(); 

    foreach (JToken token in tokenList) 
    { 
     productList.Add(JsonConvert.DeserializeObject<ProductModel>(token.ToString())); 
    } 

    return productList; 
} 

Quale tipo di dati SQL dovremmo utilizzare per la memorizzazione di tale stringa contenente JSON?

  • NVARCHAR(255)?
  • TEXT?
  • VARBINARY(MAX)?
+1

Solo qualche rumore casuale (il commento, non i dati): Si potrebbe desiderare di comprimere troppo. In tal caso hai bisogno di qualcosa di binario. D'altra parte: perché non progettare solo tabelle adeguate per i dati? –

+3

@Il chiodo: A volte la memorizzazione di qualcosa come JSON (o come "documento") è appropriata per il bisogno. Come per un motore di workflow o per la gestione di documenti, ecc. Lo sto facendo su un progetto attuale, passando dall'approccio relazionale a quello documentale per il lato comando della mia implementazione CQRS. È molto veloce se si utilizza un serializzatore come ServiceStack o JSON.Net. – swannee

risposta

23

andrò per nvarchar(max). Questo dovrebbe soddisfare il requisito.

Aggiornamento: Con SQL Server 2016 e Azure SQL, esistono molte funzionalità JSON native aggiuntive. Ciò potrebbe influire positivamente sul tuo design o approccio. Si può leggere questo per più: https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

+7

Hai davvero ** bisogno dello spazio di archiviazione Unicode da 2 byte per carattere? A seconda dei dati - potrebbe solo essere sprecando il doppio dei byte, se necessario ... (ma se ** do ** bisogno Unicode - allora questo è l'unico modo per andare, sono d'accordo) –

+5

nvarchar - perché i dati sono non definito. Se riteniamo che il sistema non avrà bisogno di Unicode, possiamo salvare trasferirsi a varchar (max) – Kangkan

+3

Inoltre, utilizzando 'nvarchar' evita i problemi di confronto si finirà per avere quando si utilizza' varchar', ma sarà più lento in termini di prestazioni di query di 'varchar'. [Ottima domanda DBA] (http://dba.stackexchange.com/questions/5346/why-is-there-still-a-varchar-data-type) con ulteriori informazioni. –

160

Certamente NON:

  • TEXT, NTEXT: quei tipi sono deprecato come di SQL Server 2005 e non deve essere utilizzato per un nuovo sviluppo. Utilizzare VARCHAR(MAX) o NVARCHAR(MAX) invece

  • IMAGE, VARBINARY(MAX): IMAGE è deprecato come TEXT/NTEXT, e non c'è davvero alcun senso la memorizzazione di una stringa di testo in una colonna binaria ....

in modo che fondamentalmente foglie VARCHAR(x) o NVARCHAR(x): VARCHAR memorizza stringhe non Unicode (1 byte per carattere) e NVARCHAR memorizza tutto in modalità Unicode a 2 byte per carattere. Quindi hai bisogno di Unicode? Potresti avere caratteri arabi, ebraici, cinesi o di altri paesi non-occidentali nelle tue corde? Poi vai con NVARCHAR

Le (N)VARCHAR colonne sono di due tipi: o si definisce una lunghezza massima che si traduce in 8000 byte o meno (VARCHAR fino a 8000 caratteri, NVARCHAR fino a 4000), o se questo non è sufficiente, utilizzare la (N)VARCHAR(MAX) versioni, che memorizzano fino a 2 GB di dati.

Aggiornamento: SQL Server avrà il supporto JSON nativo - un nuovo JSON tipo di dati (che si basa su nvarchar) sarà introdotto, così come un comando FOR JSON per convertire l'uscita da una query in formato JSON

Aggiornamento # 2: nel prodotto finale, Microsoft non ha incluso un separato JSON tipo di dati - invece, ci sono una serie di JSON-funzioni (per confezionare fino righe del database in JSON, o per analizzare JSON in dati relazionali) che funzionano su colonne di tipo NVARCHAR(n)

+16

NVARCHAR dovrebbe essere la scelta preferita in quanto il server sql 2016 lo utilizzerà per il proprio supporto JSON nativo http: //blogs.msdn .com/b/jocapc/archive/2015/05/16/jSON-supporto-in-sql-server-2016.aspx – Loudenvier

+0

@Loudenvier: grazie per l'ingresso! –

+0

@marc_s La tua istruzione "aggiornamento" è corretta? Non riesco a trovare alcun tipo di dati JSON ufficiale ...? – Nix

0

mi sento di raccomandare di utilizzare nvarchar(max) se si prevede di utilizzare le funzionalità JSON su SQL 2016 o SQL Azure.

Se non si prevede di utilizzare tali funzioni, è possibile utilizzare varbinary(max) in combinazione con le funzioni COMPRESS (e DECOMPRESS). Ulteriori informazioni: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

Le funzioni COMPRESS e DECOMPRESS utilizzano la compressione GZip standard. Se il tuo cliente è in grado di gestire la compressione GZip (ad esempio, browser che comprende il contenuto gzip), puoi restituire direttamente il contenuto compresso. Si noti che questo è un compromesso tra prestazioni e storage. Se si eseguono spesso query sui dati compressi, le prestazioni di mig sono più lente poiché il testo deve essere decompresso ogni volta.

Problemi correlati