사용하는 경우에는 SQL
또는MySQL
(또는 어떤 관계에 대한 DB 그 문제)-제가 이해하는 데이터 저장에서는 정기적으로 열을 위해 더 나은 인덱싱 술과 다른 목적으로...
는 것은 로딩 및 저장JSON
데이터가 때로는 많이 더 간단합니다. 과 개발을 위한 더 쉽습니다.
이 있"황금 규칙"저장을위한 원JSON
데이터가 DB?
그것은 절대 잘못된 관행을까?
매우 좋은 답을 주었지만,의심의 여지가 가장 잘 조직이 대답해 주@Shnugo 가치가합니다.
또한 지적에 의해 주어진 응답@Gordon Linoff 및@Amresh 들을 설명한 다른 특별한 사용 사례를 보여주고 있습니다.
하나님께 감사하고 좋은 일을 모두!
주요 질문 -당신은 무엇을 할 것이 데이터가? 고 -당신은 어떻게 필터링 정렬/입/이 데이터를 조작? JSON(XML)한 데이터 교환은 저장고 일반적으로 정의된 구조물,하지만 그것에 참여할 수 없으며 전형적인 조치를 실행 내에서 RDBMS. 대부분의 경우는 것이 나을 것입니다송 JSON 으로 데이터일반 테이블그리고 다시 만들 JSON 때 당신은 그것을 필요합니다.
첫번째 규칙이 정규화하고,지시지 않을 저장하는 하나 이상의 비트의 정보를 하나의 열입니다. 당신이 볼 열"PersonName"와 같은 값"Mickey Mouse"? 당신은 당신이 울:변경된다.
에 대해 무엇 XML 또는 JSON? 은 이러한 유형을 깨 1.NF? 론,예고없...
그것은 완벽하게 괜찮을 저장하는 전체 구조물중 하나로 비트의 정보****는 경우하나의 정보****습니다. 당신은 비누 응답을 저장하고 싶기 때문에 그것이 필요할 수 있습이 나중에 참조(그러나 당신은지를 위해 이 데이터를 사용하의 프로세스)? 저장로!
지금 상상복잡한 구조(또는 XML JSON)을 대표하는 사람(그것의 주소,더 상세히...). 지금 당신은 당신을 넣어 이것으로 하나의 열로PersonInCharge
. 이것이 잘못입니까? 안't 이 오히려에 살고 적절하게 설계는 관련 테이블을 가진 외국 키를 참조 대신 XML/JSON? 는 경우에 특히 동일한 사람에서 발생할 수 있는 많은 서로 다른 행 그것은 확실히 잘못 사용하는 XML/JSON 접근 방식이다.
하지만 지금은 상상을 저장할 필요가 역사적인 데이터입니다. 당신하고 싶유는 사람이's 에 대한 데이터 주어진 순간에 시간입니다. 어떤 일이 나중에 사람을 알려줍니다 새로운 주소? 아무 문제 없습니다! 이전 주소 생활에서는 XML/JSON 해야 하는 경우에 그것은...
결론:는 경우에 당신은 데이터를 저장을 계속,그것's 괜찮습니다. 이 데이터고유부분을,그's okay...
그러나 당신이 필요로 하는 경우에는내장 부속정기적으로는 경우 또는 뜻이 중복되는 중복 저장 it's 좋아하지 않습니...
다음은 SQL 서버와 다를 수 있습니다 다른 RDBMs. XML 로 저장되지 않고 텍스트를 참조하지만,계층으로 나무입니다. 쿼리를 이것은 놀라 울 정도로 잘 수행! 이는 구조 해석되지 않습에서 문자열 수준! JSON 에서 SQL 서버(2016+)생활에서 문자열이고 해석됩니다. 진짜 원 JSON 타입(다음과 같이 네이티브 XML 타입)으로 구성되어 있습니다. 이 올 수도 있습니다 나중에,하지만 지금은 나'd 리,JSON 지 않을 것으로 성능이 뛰어로 XML 에 SQL 서버(섹션 참조 업데이트2). 모든 필요를 읽은 값을 가 JSON 이 필요한 지옥의 많은 숨겨진된 문자열은 메소드를 호출...
당신의 사랑스러운 DB 아티스트:-D,알고있는 저장JSON로,이에 대한 일반적인 원칙의 RDBMs. 그는 알고, -는 JSON 은 매우 아마 깨 1.NF -는 JSON 에서 변경될 수 있습니다 시간(동일한 열,서로 다른 내용). -는 JSON 는 것은 쉽지 않을 읽고,그것은 매우 어려운 필터/검색/에 가입하거나 정렬합니다. -같은 작업이 변화 꽤 몇 가지 여분의 부하에 불쌍한 DB 서버 방법을 사용하여 해결할 수 있습니다(에 따라 RDBMS 당신이 사용하는)하지만 그들의 대부분 don't 하는 방식으로 작업할 수'd 요...
예 -만약 당신를 사용하지 않으려는 데이터가 저장되어 내JSON비용 작업(필터/join/일종). 저장할 수 있습니다 이것만으로 다른 모든만 존재내용입니다. 우리는 저장 많은 사진으로 Blob,그러나 우리는 것을 시도하는 필터는 모든 이미지에 대한 꽃과 함께... -하지 않는 경우 귀찮게 모든 것's 부(단지 그것을 저장하고 그것을 읽으로 한 정보의 비트) -는 경우 구조 변수는 그것이 어렵게 만들 물리적 테이블은 다음 작업 JSON data. -는 경우 구조를 깊이 중첩된 저장소에 물리적 테이블을 많이 오버헤드 없음** -사용하려는 경우 내부과 같은 데이터를'd 사용하여 관계형 테이블's 의 데이터(filter,인덱스,조인...) -당신은 당신의 것이 중복 저장(중복성) -일반:는 경우 얼굴 성능 문제는(위한 확신 것입니다 얼굴에서 그들은 일반적인 시나리오!) 로 시작할 수 있습니다 JSON 문자열 내에서 열 또는 BLOB 하고 이를 변경하는 물리적 테이블을 때 당신은 그것을 필요합니다. 내 마법 크리스탈 볼 말이 될 수 있는 내:-D
을 찾을 몇 가지 아이디어에 대한 성능과 디스크 공간에 여기:https://stackoverflow.com/a/47408528/5089204
다음 주소 JSON 및 XML 지원 SQL-Server2016
사용자@mike123 지적하면문서에 공식 microsoft blog인 증거에는 실험,그쿼리 JSON10 배 빠르게를 쿼리 XMLSQL-Server.
일부에 대한 생각을 하는:
일부 크로스 검사와"실험":
-다"실험"측정,많은 아니지만 성과 XML 의 대 JSON. 같은 조치의 점수가 급증 보낼 보석 빛나는 수집 동(변화)문자열을 반복되지 않는 현실적인 시나리오
-테스트된 예까지 간단한 일반적인 문!
-값을 읽는 항상 동일하고도 사용됩니다. 최적화 프로그램이 표시됩니다...
-지 않는 한 단어에 대해 강력한XQuery
원! 제품 찾기 주어진 ID 를 가진 내에서 배열? JSON 요구를 읽고 사용하여 나중에 필터를 사용하는 동안XML
도록 할 수 있는 내부XQuery 조건자
. 지에 대해 말하는FLWOR
...
-면"실험"코드로내에서 시스템을 제공합:JSON 것 같다 3 배 더 빨리(하지만 10 배).
-추가/(텍스트)
를XPath
을 줄이기보다 2 배. 에 관련된 문서는 사용자"미스터 Magoo"지적이는 이미지만,클릭미끼제목은 여전히 변경되지 않은...
-와 같은 쉬운 JSON 에 주어진"실험"가장 빠른 순수한 T-SQL 접근 방식의 조합이었다문
그리고반환
:-D
다음 코드를 보여줄 것이 더 현실적인 실험
-사용하여 JSON 과 동일한 XML 하나 이상의제품
(JSON 배열 형제 대의 노드)
-JSON 및 XML 은 약간 변경(10000 실행하는 번호)를 삽입 테이블이 있습니다.
-가 초기화 모두의 점수가 급증 보낼 보석 빛나는 수집 테이블을 방지첫 번째 호출에-바이어스
-모든 10000 항목을 읽기 및 검색된 값은 삽을 또 다른 표입니다.
-사용하여 이동10
를 통해 실행됩니다 이것을 차단 열 시간을 방지첫 번째 호출에-바이어스
최종 결과는 분명히 보여줍니다,즉,JSON 보다 느리 XML(지 않는 많은,약 1.5x 에서 여전히 매우 간단합니다.)
최종 보고서:
-지나치게 간단한 예제에서는 부당한 상황 JSON 보다 빠르게 수행할 수 있습니다 XML
-다루는 내용은순수한 문자열에 액션하는 동안,XML 구문 분석하고 변화합니다. 이것은 오히려 비싼에서 첫 번째 작업을,하지만 속도 모든 것을 이 번이 수행됩니다.
-JSON 더 있을 수도 있습에one-time작업(방지를 만들기 위한 오버헤드 내부 계층적 표현의 XML)
-으로 여전히 매우 간단하지만 더 현실적인 예 XML 빠를 것이에 간단한 읽기
-있을 때마다 읽을 필요가 특정 요소의 배열을,모든 항목을 필터링는 제품 id 는 포함되는 배열에,또는 이동 경로를 아래로,JSON 수 없습니다. 그것이 구문 분석해야의 문자열이 완전히 각 시간을 잡아 그것으로...
테스트 코드
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
그 결과(SQL Server2016 익스프레스에이 서 Aspire v17 니트로 Intel i7,8GB Ram)
Test SumTime
------------------
json 2706
xml 1604
이것은 너무 오래에 대한 설명입니다.
면"절대적으로 잘못",대부분의 데이터베이스는 것이 지원하지 않습니다. Okay,대부분의 데이터베이스 지원에 쉼표에서
절을 보는 것 같"절대적으로 잘못". 그러나 지원을 위한 JSON 이 새로운 개발지 이전 버전과 호환되"특징".
중 하나는 명백한 경우 JSON 구조는 단순히 BLOB 다시 전달되는 응용 프로그램입니다. 다음은 논쟁--기타 다음의 오버헤드 저장 JSON 는 불필요하게 자세하에 대한 구조화된 데이터와 일반적인 분야에서 모든 기록입니다.
또 다른 경우는"sparse"열을 경우입니다. 당신은 행과 함께 많은 가능한 컬럼이지만,이에 따라 행하는 행이 있습니다.
다른 케이스를 저장할 때"중첩"레코드에서 레코드입니다. JSON 은 능력이 있습니다.
는 경우 JSON 는 일반적인 분야에 기록하려는 쿼리에서,당신은 일반적으로 더 넣고 이에 적절한 데이터베이스를 열이 있습니다. 그러나,데이터는 복잡하고있을위한 장소와 같은 형식으로 JSON.
나는'll 파 내 마술 지팡이입니다. 휙! 황금에 대한 규칙을 사용하의 JSON:
*는 경우 MySQL 이 필요하지 않습을 보 _inside_JSON 고,응용 프로그램은 단순히 필요 컬렉션은 물건의 후,JSON 는 정밀한 가능성은 더 나은입니다.
*할 경우에서 검색하는 데이터 내부에 and 있 MariaDB10.0.1 또는 MySQL5.7(JSON 데이터와 함수)다음,JSONmight 다 실용적이다. MariaDB5.3's"Dynamic"열을 변형이다.
*를 하면"Entity-속성-가치"물건,다음 JSON 이 좋지 않다,하지만 그는 적어도 여러 악을. http://mysql.rjweb.org/doc.php/eav
*검색하여 인덱스 열을 가지고 있지 가치 내부에 묻혀 JSON 있습니다.
*색에 대한 의 범위에 인덱스 열 또는전체 텍스트 검색
또는공간
,JSON 이 가능하지 않습니다.
*을 위한디=1b=2
"합성"index 지수(a,b)`은 아마 수 있't 에 가까이 오 JSON.
*JSON 잘"sparse"데이터를 인덱싱하지만,뿐만 아니라,습니다. (나는 값'missing'또는 NULL 을 위해 많은 행이 있습니다.)
*JSON 을 줄 수 있"배열"와"나무"에 의존하지 않고 추가 테이블(s). 하지만으로 발굴하고 이러한 배열/트 only,응용 프로그램에서 발견에서 SQL.
*JSON 이 세계보다 더 나 XML 등이 있습니다. (내 의견)
*원하지 않는 경우를 얻으로 JSON 문자열을 제외하고,응용 프로그램에서 다음 권축(에서 클라이언트)에 있는 저장하기로BLOB
입니다. 과 대화하는 것이라 생각하십시오.jpg-아's 에서 물건을 거기에 있지만,SQL 상관하지 않습니다.
국가하면 응용 프로그램을 어쩌면 우리는 더 할 수 있습니다 특정한다.
새로운 SQL 서버 기능을 제공을 위해 처리 JSON 텍스트입니다. 한 정보를 포맷 JSON 으로 저장할 수 있는 텍스트로에서는 표준 SQL Server 열과 SQL 서버에서 제공하는 함수를 검색할 수 있는 값에서 이러한 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 )
)
이 간단한 구조물은 유사한 표준 NoSQL 컬렉션을 만들 수 있는 NoSQL 에 데이터베이스(예:Azure DocumentDB 또는 MongoDB)는 당신이 키를 나타내는 ID 값을 나타내는 JSON.
참고로 이며 단지 일반 텍스트입니다. SQL 서버가 내장된 텍스트를 압박하는 메커니즘을 수 있는 투명한 방식으로 압축 데이터를 디스크에 저장됩니다. 압축에 의존한 언어 갈 수 있는 50%까지 데이터에 따라(유니코드를 참조하십시오 압축).
중요한 차이는 SQL 서버와 다른 일반 NoSQL 에 데이터베이스는 SQL 서버가 사용할 수 있도록 하이브리드 데이터 모델을 저장할 수 있는 여러 가지 JSON 체에서 같은"컬렉션에"그들을 결합과 함께 정기적인 관계형 열이 있습니다.
예를 들어,상상을 우리가 알고 있는 모든 사람에서 당신의 컬렉션이 있는 이름 및 성,그리고 저장할 수 있는 일반적인 내용에 대한 사람 중 하나로 JSON,및 전화번호/이메일 주소로 별도체. SQL Server2016 우리는 쉽게 만들 수 있습니다 이 구조 없이 추가 syntax:
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 )
)
대신 하나의 JSON 객체를 구성할 수 있습니다 당신의 데이터에서"모음"입니다. 당신이 원하지 않는 경우 명시적으로 확인 구조의 각 JSON 열을 추가할 필요가 없 JSON check 에 모든 항목(이 예제에서 추가 확인 제약 조건에서만 EmailAddresses column).
비교할 경우 이 구조는 표준 NoSQL 수집되는 것을 확인할 수 있습할 것입니다에 빠르게 액세스 할 수 있는 강력한 형식의 데이터(이름 및 성). 따라서,이 솔루션은 좋은 선택한 하이브리드 모델을 식별할 수 있습니다 몇 가지 정보를 반복되는 모든 개체 및 기타 변수에 정보를 저장할 수 있으로 JSON. 이 방법으로 결합할 수 있는 유연성과 성능.
비교할 경우 이 구조는 스키마와 함께 사람의 테이블 AdventureWorks 데이터베이스에,당신은 알 수 있습니다 우리는 제거 관련된 여러 테이블이 있습니다.
단순 옆의 스키마 데이터 액세스 작업이 될 것입니다 간단한 비교하고 복잡한 관계형 구조입니다. 지금 읽을 수 있는 하나의 테이블에 합류하는 대신 여러 테이블이 있습니다. 면을 삽입해야 새 사람으로 관련 정보(이메일 주소,전화번호)삽입할 수 있습니다 단일 레코드에서 하나 테이블을 삽입하는 대신 하나의 레코드에서 AdventureWorks 사람 테이블,복 id 열을 찾는 외국인 핵심이 될 것을 저장하는 데 사용되는 휴대폰,이메일,주소 등입니다. 또한,이 모델에서 쉽게 삭제할 수 있습니다 한 사람이지 않고 행위 삭제를 사용하여 외국인 핵심 관계입니다.
NoSQL 에 데이터베이스의 최적화를 위한 간단하,읽기,삽입,삭제 작업–SQL Server2016 에 적용할 수 있도록 동일한 논리에 관계형 데이터베이스입니다.
JSON 제약 조건 이전 예제에서,우리가 볼 수 있는 방법을 추가하는 간단하 제약 조건이 유효성을 검사하는 열에 저장된 텍스트가 제대로 포맷되어 있습니다. 지만 JSON 없는 강력한 스키마에,당신은 또한 추가 할 수 있습니다 복잡한 제약 조건을 결합하여 읽을 함수에서 값 JSON 및 표준 T-SQL functions:
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}')
체크인 제약 조건 속도가 느려질 수 있습 삽입 업데이트/프로세스 수도 있습니다 그래서 그들을 피하기 위해 필요하신 경우 더 빠르게 쓰는 성능이다.
압축 JSON 스토리지 이 있는 경우 큰 JSON 텍스트할 수 있는 명시적으로 압축 JSON 를 사용하여 텍스트 내에서 압축 기능이다. 다음 예제에서는 압축 JSON 내용은 이진 데이터로 저장되며,우리가 계산 열 압축을 해제 JSON 으로 원본 텍스트를 사용하여 압축을 해제 기능:
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))
압축 및 압축 해제 기능을 사용하여 표준 GZip 으로 압축된다. 의 경우 클라이언트를 처리할 수 있 GZip 으로 압축(e.g 브라우저를 이해하는 gzip 콘텐츠)에 직접 반품 압축된 내용입니다. 참고로 이것은 성능/저장이 떨어질 수도 있습니다. 자주 사용하는 경우 쿼리에 압축된 데이터를 mig 가 느리기 때문에 성능 텍스트의 압축을 해제됩니다.
참고:JSON 함수에서만 사용할 수 있는 SQL Server2016+고 Azure SQL 데이터베이스가 있습니다.
더 읽을 수 있는 소스에서의 이 문서
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/23/storing-json-in-sql-server/
질문이 있을 요청은:
나이 있음을 사용하여만 이 데이터베이스?
마
DON'T
"황금 규칙"I 에서 사용 가능한 손으로 웨이브 형 종류의 방법으로는 필요한 경우에 JSON 으 its raw format,it's okay 를 저장할 수 있습니다. 가 있는 경우를 만들의 특별한 지점을 분석,그것은's 하지 않습니다.
예를 들면,나는'm 을 만드는 API 를 보내는 원 JSON,그리고 어떤 이유에서 이 가치가 아't 를 변경하려고,다음's괜찮아으로 그것을 저장하는것은 원 JSON. 가 있는 경우를 구문 분석,그것을 변경,업데이트,등등....다음 그렇지 않습니다.
Json's 지에 relationional db's. 당신이 펼쳐 json 으로 열 및 저장소에서 db,it's 좋지만 저장 json 으로 blob 은 다음에 그것을 사용하여 데이터 기록 보관 시스템입니다.
몇 가지 이유가 있을 수 있습에 대한 전개되지 않 json 및 저장 하에서 단일한 열 결정을 촬영 한 것으로 값에는 json 필드에 사용되지 않 쿼리(또는 값을 이미 전개로 열).
또한,대부분의 json 처리하는 경우에는 모든 분야 쿼리했을 것 밖에서 sql 환경으로 sql 지에 대한 의미 json 처리합니다. 진짜 문제는 다음이되고,어디에 저장 이 json,나는 단지 그것으로 파일은 필요한 경우 쿼리를 통해 다른 시스템(불꽃 hive/etc.).
나는 것에 동의 DB 아티스트,don't 를 사용에 대한 RDBMS 관합니다. 있다 더 싼 옵션이 있습니다. 또한 json blob 과를 얻을 수 있습을 시작할 수 있습 bogging DB 디스크 공간은 시간과 함께.
PostgreSQL 내장json
와대화는 두서없이
데이터의 유형
이들은 몇 가지 예:
CREATE TABLE orders (
ID serial NOT NULL PRIMARY KEY,
info json NOT NULL
);
INSERT INTO orders (info)
VALUES
(
'{ "customer": "Lily Bush", "items": {"product": "Diaper","qty": 24}}'
),
(
'{ "customer": "Josh William", "items": {"product": "Toy Car","qty": 1}}'
),
(
'{ "customer": "Mary Clark", "items": {"product": "Toy Train","qty": 2}}'
);
PostgreSQL 제공하는 두 가지 기본 연산자->
와->>
을 쿼리 JSON data.
운전자->
반환 JSON 개체 분야에 의 열쇠이다.
운전자->>
반환 JSON 개체 분야에 의한 텍스트입니다.
SELECT
info -> 'customer' AS customer
FROM
orders;
SELECT
info ->> 'customer' AS customer
FROM
orders
WHERE
info -> 'items' ->> 'product' = 'Diaper'