Kiedy mogę zapisać dane JSON lub XML w tabeli SQL

Przy użyciu SQL LUB MySQL (lub dowolnego relacyjnego DB) - rozumiem, że zapisywanie danych w zwykłych kolumnach jest lepsze do indeksowania i innych celów...

Ładowanie i zapisywanie danych jest czasem o wiele prostsze. i ułatwia rozwój.

Czy są jakieś "złote zasady" do zapisywania raw JSON danych w DB?

Czy jest to absolutnie zła praktyka?

Podsumowanie

Bardzo ładne odpowiedzi, ale nie wątpliwość najlepiej zorganizowana jest Odpowiedź udzielona przez @ Shnugo, która zasługuje na nagrodę.

Chciałbym również zwrócić uwagę na odpowiedzi udzielone przez @ Gordon Linoff i @Amresh Pandey za Wyjaśnienie innych specjalnych przypadków użycia.

Dzięki Bogu i dobra robota wszystkim!
Author: Shnugo, 2017-04-19

7 answers

Główne pytania to

    Co zamierzasz zrobić z tymi danymi? oraz
  • Jak filtrujesz/sortujesz/łączysz / manipulujesz tymi danymi?

JSON (podobnie jak XML) jest świetny do wymiany danych, małej pamięci masowej i ogólnie zdefiniowanych struktur, ale nie może uczestniczyć w typowych działaniach uruchamianych w RDBMS. W większości przypadków lepiej będzie przenieść dane JSON do normalnych tabel i ponownie utworzyć JSON, gdy zajdzie taka potrzeba to.

XML / JSON i 1.NF

Pierwsza zasada normalizacji nakazuje, aby nigdy nie przechowywać więcej niż jednego bitu informacji w jednej kolumnie. Widzisz kolumnę "PersonName" o wartości "Mickey Mouse"? Wskazujesz na to i płaczesz: Zmień to natychmiast!

A co z XML lub JSON? Czy te typy łamią 1.NF tak i nie... 

Doskonale jest przechowywać kompletną strukturę jako jeden bit informacji jeśli jest Właściwie to jedna informacja. Otrzymujesz odpowiedź SOAP i chcesz ją przechowywać, ponieważ możesz potrzebować jej do przyszłego odniesienia (ale nie będziesz używać tych danych do własnych procesów)? Po prostu przechowuj tak jak jest !

Teraz wyobraź sobie złożoną strukturę (XML lub JSON) reprezentującą osobę (z jej adresem, dalsze szczegóły...). Teraz umieść to w jednej kolumnie jako PersonInCharge. Czy to źle? Czy to nie powinno raczej żyć w odpowiednio zaprojektowanym powiązane tabele z odniesieniem do klucza obcego zamiast XML / JSON? Szczególnie jeśli ta sama osoba może występować w wielu różnych wierszach, zdecydowanie błędne jest stosowanie podejścia XML / JSON.

Ale teraz wyobraź sobie potrzebę przechowywania danych historycznych. Chcesz utrwalić dane danej osoby przez dany moment w czasie. Kilka dni później osoba podaje Ci nowy adres? Nie ma sprawy! Stary adres żyje w XML / JSON, jeśli kiedykolwiek go potrzebujesz...

Wniosek: jeśli przechowuj dane, aby je zachować. Jeśli te dane są unikalną porcją, to jest w porządku...
Ale jeśli potrzebujesz wewnętrznych części regularnie lub jeśli oznaczałoby to nadmiarowe duplikaty pamięci, nie jest to w porządku...

Fizyczne przechowywanie

Poniższy tekst dotyczy SQL Server i może się różnić w innych systemach Rdbm.

XML nie jest przechowywany jako tekst, który widzisz, ale jako drzewo hierarchii. Pytanie to jest zadziwiająco dobrze wykonujące! Struktura ta nie jest parsed on string level!
JSON w SQL Server (2016+) żyje w łańcuchu znaków i musi być przetwarzany. Nie ma prawdziwego natywnego typu JSON (tak jak jest natywny typ XML). Może to nastąpić później, ale na razie zakładam, że JSON nie będzie tak wydajny jak XML na SQL Server (patrz sekcja UPDATE 2). Jakakolwiek potrzeba odczytania wartości z JSON będzie wymagała ogromnej ilości ukrytych wywołań metod string...

Co to oznacza dla Ciebie?

Your lovable DB artist: - d wie, że przechowywanie JSON jak jest, jest sprzeczne ze wspólnymi zasadami RDBMs. On wie,

  • że JSON pewnie się łamie 1.NF
  • że JSON może się zmienić w czasie (ta sama kolumna, różna treść).
  • że JSON nie jest łatwy do odczytania i bardzo trudno jest filtrować/wyszukiwać / łączyć lub sortować według niego.
  • że takie operacje przeniosą sporo dodatkowego obciążenia na słaby mały serwer DB

Istnieją pewne obejścia (w zależności od RDBMS, których używasz), ale większość z nich nie działa tak, jak chcesz...

Odpowiedź na twoje pytanie w skrócie

Tak

  • jeśli nie chcesz używać danych, które są przechowywane W twojego JSON do kosztownych operacji (filter/join/sort).
    Możesz przechowywać tę zawartość tak jak każda inna istnieje tylko. Przechowujemy wiele zdjęć jako Bloby, ale nie próbowalibyśmy filtrować wszystkich obrazów za pomocą kwiat...
  • Jeśli w ogóle nie przejmujesz się tym, co jest w środku (po prostu przechowuj i przeczytaj jako jedną informację)]}
  • jeśli struktury są zmienne, co utrudniłoby tworzenie tabel fizycznych, a następnie pracę z danymi JSON.
  • jeśli struktura jest głęboko zagnieżdżona, to Przechowywanie w tabelach fizycznych jest zbyt duże]}

Nie

  • jeśli chcesz użyć danych wewnętrznych, tak jak używasz danych tabeli relacyjnej (filtr, indeksy, / align = "left" / ..)
  • jeśli chcesz przechowywać duplikaty (utworzyć redundancję)
  • ogólnie: jeśli napotkasz problemy z wydajnością (na pewno napotkasz je w wielu typowych scenariuszach!)

Możesz zacząć od JSON w kolumnie łańcuchowej lub jako BLOB I zmienić to na tabele fizyczne, gdy tego potrzebujesz. Moja magiczna Kryształowa kula mówi mi, że to może być jutro: - d

UPDATE

Tutaj znajdziesz kilka pomysłów na wydajność i przestrzeń dyskową: https://stackoverflow.com/a/47408528/5089204

Aktualizacja 2: więcej o wydajności...

Poniżej adresy obsługa JSON i XML w SQL-Server 2016

[14]}użytkownik @mike123 wskazał na artykuł {146]} na oficjalnym blogu Microsoftu, który wydaje się dowodem w eksperymencie, że odpytywanie JSON jest 10 x szybsze, a następnie odpytywanie XML W Sql-Server.

Kilka przemyśleń na ten temat:

Niektóre kontrole krzyżowe "eksperyment": {]}

  • "eksperyment" mierzy wiele, ale nie Wydajność XML vs. JSON. Wykonywanie tej samej akcji i powtarzanie tego samego (niezmienionego) ciągu znaków nie jest realistycznym scenariuszem
  • testowane przykłady są daleko do prostoty dla ogólnego stwierdzenia !
  • odczytana wartość jest zawsze taka sama i nawet nie jest używana. Optymalizator to zobaczy...
  • Ani słowa o potężnym wsparciu! Znajdź produkt z danym ID w tablicy? JSON musi odczytać całość i użyć filtra używając WHERE, podczas gdy XML pozwoli na wewnętrzne XQuery predicate. Nie mówić o FLWOR...
  • kod " eksperymentów " Jak jest{[24] } W moim systemie przywołuje: JSON wydaje się być 3x szybszy (ale nie 10x).
  • dodanie /text() do XPath zmniejsza to do mniej niż 2x. W powiązanym artykule użytkownik "Mister Magoo" zwrócił już na to uwagę, ale tytuł click-bait jest nadal bez zmian...
  • przy tak łatwym JSON jak podano w "eksperymencie" najszybsze czyste podejście T-SQL było kombinacją SUBSTRING i CHARINDEX:- D

Poniższy kod pokaże bardziej realistyczny eksperyment

    XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML-XML]}
  • JSON i XML są nieznacznie zmieniane (10000 numerów bieżących) i wstawiane do tabel.
  • istnieje początkowe wywołanie obu tabel do avoid first-call-bias
  • wszystkie 10000 wpisów jest odczytywanych, a pobrane wartości są wstawiane do innej tabeli.
  • użycie GO 10 będzie przebiegać przez ten blok dziesięć razy, aby uniknąć first-call-bias

Ostateczny wynik jasno pokazuje, że JSON jest wolniejszy niż XML (nie tak dużo, około 1.5 x na wciąż bardzo prostym przykładzie).

Ostatnia wypowiedź:

  • z zbyt uproszczonym przykładem w nieuzasadnionych okolicznościach JSON może być szybszy niż XML
  • radzenie sobie z JSON jest czystą akcją łańcuchową , podczas gdy XML jest przetwarzany i przekształcany. Jest to dość kosztowne w pierwszej akcji, ale przyspieszy wszystko, gdy to zrobisz.
  • JSON może być lepszy w jednorazowej akcji (uniknięcie kosztów tworzenia wewnętrznej hierarchicznej reprezentacji XML)
  • z jeszcze bardzo prostym, ale bardziej realistycznym przykładem XML będzie szybszy w prostym czytaniu
  • ilekroć istnieje potrzeba odczytania określonego elementu z tablicy, aby filtrować wszystkie wpisy, w których dany ProductID jest zawarty w tablicy, lub aby poruszać się w górę iw dół ścieżki, JSON nie może się utrzymać. Musi być całkowicie parsowany z łańcucha-za każdym razem, gdy musisz go złapać...

Kod testu

USE master;
GO
--create a clean database
CREATE DATABASE TestJsonXml;
GO
USE TestJsonXml;
GO
--create tables
CREATE TABLE TestTbl1(ID INT IDENTITY,SomeXml XML);
CREATE TABLE TestTbl2(ID INT IDENTITY,SomeJson NVARCHAR(MAX));
CREATE TABLE Target1(SomeString NVARCHAR(MAX));
CREATE TABLE Target2(SomeString NVARCHAR(MAX));
CREATE TABLE Times(Test VARCHAR(10),Diff INT)
GO
--insert 10000 XMLs into TestTbl1
WITH Tally AS(SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL))*2 AS Nmbr FROM master..spt_values AS v1 CROSS APPLY master..spt_values AS v2)
INSERT INTO TestTbl1(SomeXml)
SELECT 
N'<Root>
    <Products>
    <ProductDescription>
        <Features>
            <Maintenance>' + CAST(Nmbr AS NVARCHAR(10)) + ' year parts and labor extended maintenance is available</Maintenance>
            <Warranty>1 year parts and labor</Warranty>
        </Features>
        <ProductID>' + CAST(Nmbr AS NVARCHAR(10)) + '</ProductID>
        <ProductName>Road Bike</ProductName>
    </ProductDescription>
    <ProductDescription>
        <Features>
            <Maintenance>' + CAST(Nmbr + 1 AS NVARCHAR(10)) + ' blah</Maintenance>
            <Warranty>1 year parts and labor</Warranty>
        </Features>
        <ProductID>' + CAST(Nmbr + 1 AS NVARCHAR(10)) + '</ProductID>
        <ProductName>Cross Bike</ProductName>
    </ProductDescription>
    </Products>
</Root>'
FROM Tally;

--insert 10000 JSONs into TestTbl2
WITH Tally AS(SELECT TOP 10000 ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nmbr FROM master..spt_values AS v1 CROSS APPLY master..spt_values AS v2)
INSERT INTO TestTbl2(SomeJson)
SELECT 
N'{
    "Root": {
        "Products": {
            "ProductDescription": [
                {
                    "Features": {
                        "Maintenance": "' + CAST(Nmbr AS NVARCHAR(10)) + ' year parts and labor extended maintenance is available",
                        "Warranty": "1 year parts and labor"
                    },
                    "ProductID": "' + CAST(Nmbr AS NVARCHAR(10)) + '",
                    "ProductName": "Road Bike"
                },
                {
                    "Features": {
                        "Maintenance": "' + CAST(Nmbr + 1 AS NVARCHAR(10)) + ' blah",
                        "Warranty": "1 year parts and labor"
                    },
                    "ProductID": "' + CAST(Nmbr + 1 AS NVARCHAR(10)) + '",
                    "ProductName": "Cross Bike"
                }
            ]
        }
    }
}'
FROM Tally;
GO

--Do some initial action to avoid first-call-bias
INSERT INTO Target1(SomeString)
SELECT SomeXml.value('(/Root/Products/ProductDescription/Features/Maintenance/text())[1]', 'nvarchar(4000)')
FROM TestTbl1;
INSERT INTO Target2(SomeString)
SELECT JSON_VALUE(SomeJson, N'$.Root.Products.ProductDescription[0].Features.Maintenance')
FROM TestTbl2;
GO

--Start the test
DECLARE @StartDt DATETIME2(7), @EndXml DATETIME2(7), @EndJson DATETIME2(7);

--Read all ProductNames of the second product and insert them to Target1
SET @StartDt = SYSDATETIME();
INSERT INTO Target1(SomeString)
SELECT SomeXml.value('(/Root/Products/ProductDescription/ProductName/text())[2]', 'nvarchar(4000)')
FROM TestTbl1
ORDER BY NEWID();
--remember the time spent
INSERT INTO Times(Test,Diff)
SELECT 'xml',DATEDIFF(millisecond,@StartDt,SYSDATETIME());

--Same with JSON into Target2
SET @StartDt = SYSDATETIME();
INSERT INTO Target2(SomeString)
SELECT JSON_VALUE(SomeJson, N'$.Root.Products.ProductDescription[1].ProductName')
FROM TestTbl2
ORDER BY NEWID();
--remember the time spent
INSERT INTO Times(Test,Diff)
SELECT 'json',DATEDIFF(millisecond,@StartDt,SYSDATETIME());

GO 10 --do the block above 10 times

--Show the result
SELECT Test,SUM(Diff) AS SumTime, COUNT(Diff) AS CountTime
FROM Times
GROUP BY Test;
GO
--clean up
USE master;
GO
DROP DATABASE TestJsonXml;
GO
W 2016 roku firma SQL Server wprowadziła do swojej oferty nową wersję SQL Server 2016 Express, która została zaprojektowana przez firmę Acer Aspire V17 Nitro Intel i7, 8GB Ram.]}
Test    SumTime 
------------------
json    2706    
xml     1604    
 43
Author: Shnugo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-26 06:53:28

To za długo na komentarz.

Gdyby to było "absolutnie złe", to większość baz danych nie wspierałaby tego. Ok, większość baz danych obsługuje przecinki w klauzuli FROM i uważam to za "absolutnie błędne". Ale wsparcie dla JSON to nowy rozwój, a nie wstecznie kompatybilna "funkcja".

Oczywistym przypadkiem jest sytuacja, gdy struktura JSON jest po prostu BLOBEM przekazywanym z powrotem do aplikacji. Wtedy nie ma dyskusji -- inne niż napowietrzne przechowywanie JSON, co jest niepotrzebnie werbalne dla danych strukturyzowanych z polami wspólnymi w każdym rekordzie.

Innym przypadkiem jest przypadek" sparse " columns. Masz wiersze z wieloma możliwymi kolumnami, ale różnią się one w zależności od wiersza.

Inny przypadek dotyczy przechowywania "zagnieżdżonych" rekordów w rekordzie. JSON jest potężny.

Jeśli JSON ma wspólne pola w rekordach, na których chcesz odpytywać, to zwykle lepiej umieścić je w odpowiednich kolumnach bazy danych. Jednak dane są skomplikowane i istnieje miejsce dla formatów takich jak JSON.

 11
Author: Gordon Linoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-19 11:51:29

Pomacham magiczną różdżką. Puf! Złote zasady korzystania z JSON:

  • Jeśli MySQL nie musi szukać wewnątrz JSON, a aplikacja po prostu potrzebuje kolekcji rzeczy, to JSON jest w porządku, być może nawet lepiej.

  • Jeśli będziesz szukał danych wewnątrz i masz MariaDB 10.0.1 lub MySQL 5.7 (z typem danych i funkcjami JSON), to JSON Może być praktyczny. "Dynamiczne" kolumny MariaDB 5.3 to wariant na to.

  • Jeśli robisz rzeczy "Encja-atrybut-wartość", to JSON nie jest dobry, ale jest najmniej z kilku złych. http://mysql.rjweb.org/doc.php/eav

  • W przypadku wyszukiwania po zindeksowanej kolumnie, brak wartości ukrytej w JSON jest dużym plusem.

  • W przypadku przeszukiwania według zakresu na indeksowanej kolumnie lub FULLTEXT LUB SPATIAL JSON nie jest możliwy.

  • Dla WHERE a=1 AND b=2 indeks "composite" {[3] } jest świetny; prawdopodobnie nie może zbliż się do JSONA.

  • JSON działa dobrze z "rzadkimi" danymi; indeksowanie działa, ale nie tak dobrze, z takimi. (Mam na myśli wartości, które są "brakujące" lub NULL dla wielu wierszy.)

  • JSON może dać ci "tablice " i" drzewa " bez uciekania się do dodatkowej tabeli(S). Ale kopać w takie tablice / drzewa tylko w aplikacji, Nie W SQL.

  • JSON jest lepszy od XML. (Moja opinia)

  • Jeśli nie chcesz uzyskać do ciągu JSON z wyjątkiem aplikacji, to polecam skompresować (w kliencie) to zapis do BLOB. Pomyśl o tym jak o ... jpg -- tam są rzeczy, ale SQL ma to gdzieś.

Podaj swoje podanie; może będziemy bardziej dokładni.

 8
Author: Rick James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 00:19:50

Nowy SQL Server udostępnia funkcje do przetwarzania tekstu JSON. Informacje sformatowane jako JSON mogą być przechowywane jako tekst w standardowych kolumnach SQL Server, a SQL Server zapewnia funkcje, które mogą pobierać wartości z tych obiektów JSON.

    DROP TABLE IF EXISTS Person

 CREATE TABLE Person 
 ( _id int identity constraint PK_JSON_ID primary key,
 value nvarchar(max)
 CONSTRAINT [Content should be formatted as JSON]
 CHECK ( ISJSON(value)>0 )
 )

Ta prosta struktura jest podobna do Standardowej kolekcji NoSQL, którą można utworzyć w bazach danych NoSQL (np.

Zauważ, że NVARCHAR to nie jest zwykły tekst. SQL Server posiada wbudowany mechanizm kompresji tekstu, który może transparentnie kompresować dane przechowywane na dysku. Kompresja zależy od języka i może wzrosnąć do 50% w zależności od danych (patrz kompresja UNICODE).

Kluczową różnicą między SQL server a innymi zwykłymi bazami danych NoSQL jest to, że SQL Server umożliwia użycie hybrydowego modelu danych, w którym można przechowywać kilka obiektów JSON w tej samej "kolekcji" i łączyć je ze zwykłymi relacyjnymi kolumny.

Jako przykład, wyobraź sobie, że wiemy, że każda osoba w Twojej kolekcji będzie miała Imię I Nazwisko, i że możesz przechowywać ogólne informacje o tej osobie jako jeden obiekt JSON, a numery telefonów/adresy e-mail jako oddzielne obiekty. W SQL Server 2016 możemy łatwo utworzyć tę strukturę bez dodatkowej składni:

DROP TABLE IF EXISTS Person

CREATE TABLE Person (

 PersonID int IDENTITY PRIMARY KEY,

 FirstName nvarchar(100) NOT NULL,

 LastName nvarchar(100) NOT NULL,

 AdditionalInfo nvarchar(max) NULL,

 PhoneNumbers nvarchar(max) NULL,

 EmailAddresses nvarchar(max) NULL
 CONSTRAINT [Email addresses must be formatted as JSON array]
 CHECK ( ISJSON(EmailAddresses)>0 )

 )

Zamiast pojedynczego obiektu JSON możesz uporządkować swoje dane w tej "kolekcji". Jeśli nie chcesz wyraźnie sprawdzić struktury każda kolumna JSON, nie trzeba dodawać JSON check constraint na każdej kolumnie (w tym przykładzie dodałem CHECK constraint tylko na kolumnie EmailAddresses).

Jeśli porównasz tę strukturę ze standardową kolekcją NoSQL, możesz zauważyć, że będziesz miał szybszy dostęp do silnie wpisanych danych (FirstName i LastName). Dlatego To rozwiązanie jest dobrym wyborem dla modeli hybrydowych, w których można zidentyfikować niektóre informacje powtarzające się we wszystkich obiektach oraz inne informacje zmienne może być przechowywany jako JSON. W ten sposób można połączyć elastyczność i wydajność.

Jeśli porównasz tę strukturę ze schematem bazy danych Person table AdventureWorks, możesz zauważyć, że usunęliśmy wiele powiązanych tabel.

Oprócz prostoty schematu, operacje dostępu do danych będą prostsze w porównaniu ze złożoną strukturą relacyjną. Teraz możesz czytać pojedynczą tabelę zamiast łączyć kilka tabel. Kiedy trzeba wstawić nową osobę z powiązanymi informacjami (e-mail adresy, numery telefonów) możesz wstawić jeden rekord w jednej tabeli zamiast wstawiać jeden rekord w tabeli osób AdventureWorks, biorąc kolumnę tożsamość, aby znaleźć klucz obcy, który będzie używany do przechowywania telefonów, adresów e-mail itp. Ponadto w tym modelu można łatwo usunąć wiersz pojedynczej osoby bez usuwania kaskadowego za pomocą relacji kluczy obcych.

Bazy danych NoSQL są zoptymalizowane do prostych operacji odczytu, wstawiania i usuwania-SQL Server 2016 umożliwia zastosowanie tego samego logika w relacyjnej bazie danych.

JSON W poprzednich przykładach widzieliśmy, jak dodać proste ograniczenie, które sprawdza, czy tekst przechowywany w kolumnie jest poprawnie sformatowany. Chociaż JSON nie ma silnego schematu, można również dodać złożone ograniczenia, łącząc funkcje, które odczytują wartości z JSON i standardowych funkcji T-SQL:

ALTER TABLE Person
 ADD CONSTRAINT [Age should be number]
 CHECK ( ISNUMERIC(JSON_VALUE(value, '$.age'))>0 )

 ALTER TABLE Person
 ADD CONSTRAINT [Person should have skills]
 CHECK ( JSON_QUERY(value, '$.skills') IS NOT NULL)
First constraint will take the value of $.age property and check is this numeric value. Second constraint will try to find JSON object in $.skills property and verify that it exists. The following INSERT statements will fail due to the violation of constraints:



INSERT INTO Person(value)
 VALUES ('{"age": "not a number", "skills":[]}')

 INSERT INTO Person(value)
 VALUES ('{"age": 35}')

Zauważ, że ograniczenia sprawdzania mogą spowolnić procesy wstawiania/aktualizacji, więc możesz ich unikać, jeśli potrzebujesz szybszego zapisu wydajność.

Skompresowana pamięć JSON Jeśli masz duży tekst JSON, możesz jawnie skompresować tekst JSON za pomocą wbudowanej funkcji kompresji. W poniższym przykładzie skompresowana zawartość JSON jest przechowywana jako dane binarne, a my obliczyliśmy kolumnę, która dekompresuje JSON jako tekst oryginalny za pomocą funkcji dekompresji:

CREATE TABLE Person

 ( _id int identity constraint PK_JSON_ID primary key,

 data varbinary(max),

 value AS CAST(DECOMPRESS(data) AS nvarchar(max))

 )



 INSERT INTO Person(data)

 VALUES (COMPRESS(@json))

Funkcje kompresji i dekompresji wykorzystują standardową kompresję GZip. Jeśli twój klient obsługuje kompresję GZip (np. przeglądarkę, która rozumie zawartość gzip), możesz bezpośrednio zwraca skompresowaną zawartość. Należy pamiętać, że jest to kompromis wydajności/pamięci masowej. Jeśli często odpytywasz skompresowane dane, mig ma wolniejszą wydajność, ponieważ tekst musi być dekompresowany za każdym razem.

Uwaga: funkcje JSON są dostępne tylko w SQL Server 2016+ i Azure SQL Database.

Więcej można przeczytać ze źródła tego artykułu

Https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/

 7
Author: AMRESH PANDEY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 10:59:38

"złota zasada", której używam, w sposób ręczny, polega na tym, że jeśli potrzebuję JSON w formacie raw, mogę go przechowywać. Jeśli muszę zrobić szczególny punkt analizy, to nie jest.

Na przykład, jeśli tworzę API, które wysyła raw JSON, i z jakiegokolwiek powodu ta wartość nie zmieni się, to jest w porządku, Aby zapisać go jako raw JSON. Jeśli muszę to przeanalizować, zmienić, zaktualizować itp... więc nie za bardzo.

 4
Author: piisexactly3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-25 13:44:07

Pytanie, które musisz zadać to:

Czy jestem przywiązany do korzystania tylko z tej bazy danych?

DO

  1. Jeśli możesz użyć innej bazy danych do przechowywania JSON, użyj rozwiązania do przechowywania dokumentów, takiego jak CouchDB, DynamoDB lub MongoDB.
  2. użyj możliwości przechowywania dokumentów DB do indeksowania i wyszukiwania danych hierarchicznych.
  3. użyj relacyjnej bazy danych dla swoich danych relacyjnych.
  4. użyj relacyjnej bazy danych do raportowania, hurtowni danych i danych Górnictwo.

DON ' T

  1. przechowuj JSON jako ciąg znaków, jeśli to możliwe.
  2. spróbuj wymyślić maksymalną długość danych JSON.
  3. użyj varchar do przechowywania JSON (użyj text / blob jeśli musisz).
  4. spróbuj wyszukać wartości zapisane w JSON.
  5. martwić się o unikanie JSON do przechowywania jako string.
 3
Author: Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-26 20:48:23

Json nie są świetne w stosunku do db. jeśli rozłożyć json na kolumny i przechowywać w db, to jest świetne, ale przechowywanie json jako blob jest obok używania go jako systemu archiwizacji danych.

Może być kilka powodów, dla których nie rozwijamy json i nie przechowujemy go w jednej kolumnie, ale decyzja zostałaby podjęta, ponieważ wartości w tym polu json nie będą używane do żadnego zapytania (lub wartości zostały już rozłożone na kolumny).

Również większość json przetwarzanie, jeśli w ogóle pole zostało zapytane, byłoby poza środowiskiem sql, ponieważ sql nie jest przeznaczony do przetwarzania json. Prawdziwe pytanie staje się wtedy, gdzie mam przechowywać ten json, czy po prostu niech to będzie jako płaskie pliki i gdy wymagane odpytywać je przez jakiś inny system(spark / hive / etc).

Zgadzam się z Twoim DB artist , nie używaj RDBMS do archiwizacji. Są tańsze opcje. Również bloby json mogą stać się ogromne i mogą zacząć zagłębiać się w przestrzeni dyskowej DB z czasem.

 2
Author: Satyadev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 07:34:39