2012-02-09 16 views
98

Jaki jest najlepszy typ danych SQL do przechowywania ciągu JSON?Jaki jest najlepszy typ danych SQL do przechowywania ciągu 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; 
} 

Który typ danych SQL powinien być używany do przechowywania takiego łańcucha zawierającego JSON?

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

Po prostu kilka losowych szumów (komentarz, nie dane): Możesz również skompresować. W takim przypadku potrzebujesz czegoś binarnego. Z drugiej strony: dlaczego nie zaprojektować odpowiednich tabel dla danych? –

+3

@ Nail: Czasami przechowywanie czegoś jako JSON (lub jako "dokument") jest odpowiednie dla potrzeb. Tak jak w przypadku silnika workflow lub zarządzania dokumentami itp. Robię to w ramach bieżącego projektu, w rzeczywistości przechodzę od podejścia relacyjnego do dokumentacyjnego po stronie poleceń mojej implementacji CQRS. Jest bardzo szybki, jeśli używasz serializera, takiego jak ServiceStack lub JSON.Net. – swannee

Odpowiedz

23

Wybieram nvarchar(max). To powinno pasować do wymogu.

Aktualizacja: Z SQL Server 2016 i Azure SQL, istnieje wiele dodatkowych rodzimych możliwości JSON. Może to pozytywnie wpłynąć na twój projekt lub podejście. Możesz przeczytać więcej o: https://docs.microsoft.com/en-us/sql/relational-databases/json/json-data-sql-server

+7

Czy ** naprawdę ** potrzebujesz przechowywania danych w Unicode 2-bajtów na znak? W zależności od twoich danych - może to być marnowanie dwa razy tyle bajtów ile potrzeba ... (ale jeśli ** potrzebujesz ** potrzebujesz Unicode - to jest jedyna droga, zgadzam się!) –

+5

nvarchar - ponieważ dane są Nie określono. Jeśli uważamy, że system nie potrzebuje unicodu, możemy zapisać przejście do varchar (max) – Kangkan

+3

Ponadto, używając 'nvarchar' unika problemów z sortowaniem, które ostatecznie będziesz miał podczas używania' varchar', ale będzie wolniejszy w wydajności zapytań niż 'varchar'. [Świetne pytanie DBA] (http://dba.stackexchange.com/questions/5346/why-is-there-still-a-varchar-data-type) z dodatkowymi informacjami. –

160

pewnością NIE:

  • TEXT, NTEXT: te typy są przestarzałe jak SQL Server 2005 i nie powinny być wykorzystywane do nowego rozwoju. Użyj VARCHAR(MAX) lub NVARCHAR(MAX) zamiast

  • IMAGE, VARBINARY(MAX): IMAGE jest przestarzała jak TEXT/NTEXT, i naprawdę nie ma sensu przechowywanie tekst w kolumnie binarnej ....

tak, że w zasadzie liści VARCHAR(x) lub NVARCHAR(x): VARCHAR przechowuje ciągi nie będące kodami Unicode (1 bajt na znak) i NVARCHAR przechowuje wszystko w trybie Unicode 2 bajty na znak. Potrzebujesz Unicode? Czy masz potencjalnie w swoich strunach arabskie, hebrajskie, chińskie lub inne znaki spoza Europy Zachodniej? Następnie przejdź z NVARCHAR

W (N)VARCHAR kolumny są w dwóch smakach: albo określić maksymalną długość, że wyniki w 8000 bajtów lub mniej (VARCHAR maksymalnie 8000 znaków, NVARCHAR do 4000), a jeśli to nie wystarczy, należy użyć Wersje (N)VARCHAR(MAX), które przechowują do 2 GB danych.

Aktualizacja: SQL Server będzie miał natywną obsługę JSON - nowy JSON typ danych (który jest oparty na nvarchar) zostaną wprowadzone, a także polecenia FOR JSON konwertować wyjście z kwerendy w formacie JSON

Aktualizacja # 2: w produkcie końcowym, Microsoft nie obejmują oddzielną JSON typ danych - zamiast, istnieje szereg JSON funkcji (do spakowania się wiersze bazy danych do JSON, lub do analizowania JSON do danych relacyjnych) które działają na kolumnach typu NVARCHAR(n)

+16

NVARCHAR powinien być preferowanym wyborem, ponieważ serwer sql 2016 użyje go dla swojej macierzystej obsługi JSON http: //blogs.msdn .com/b/jocapc/archive/2015/05/16/json-support-in-sql-server-2016.aspx – Loudenvier

+0

@Loudenvier: dzięki za wejście! –

+0

@marc_s Czy Twoja instrukcja "aktualizacji" jest poprawna? Nie mogę znaleźć żadnych oficjalnych typów danych JSON ...? – Nix

0

Polecam używać nvarchar(max), jeśli zamierzasz używać funkcji JSON w SQL 2016 lub Azure SQL.

Jeśli nie planujesz użyć tych funkcji, możesz użyć funkcji varbinary(max) w połączeniu z funkcjami COMPRESS (i DECOMPRESS). Więcej informacji: https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

Funkcje COMPRESS i DECOMPRESS korzystają ze standardowej kompresji GZip. Jeśli twój klient może obsłużyć kompresję GZip (np. Przeglądarka, która rozumie zawartość gzip), możesz bezpośrednio zwrócić skompresowaną treść. Zwróć uwagę, że jest to kompromis pomiędzy wydajnością a pamięcią masową. Jeśli często wysyłasz zapytanie do skompresowanych danych, mig ma mniejszą wydajność, ponieważ tekst musi zostać zdekompresowany za każdym razem.

Powiązane problemy