복붙노트

[SQL] 나는 SQL 표 JSON 또는 XML 데이터를 저장할 수있는 경우

SQL

나는 SQL 표 JSON 또는 XML 데이터를 저장할 수있는 경우

SQL 또는 MySQL의 (또는 그 문제에 대한 모든 관계형 DB)를 사용하는 경우 - 나는 정기적으로 컬럼에 데이터를 저장하는 인덱싱 술과 다른 목적을 위해 더 나은 것을 이해 ...

문제는로드 및 JSON 데이터를 저장 때로는 훨씬 더 간단합니다 - 쉽게 개발한다.

DB에 원시 JSON 데이터를 저장하기위한 모든 "황금 규칙"이 있습니까?

그렇게 할 수있는 나쁜 관행은 절대적인가?

해결법

  1. ==============================

    1.주요 질문은

    주요 질문은

    JSON은 (XML과 같은) 데이터 교환, 작은 저장 및 일반적으로 정의 구조를 위해 중대하다, 그러나 당신이 당신의 RDBMS 내에서 실행되는 일반적인 활동에 참여할 수 없습니다. 대부분의 경우 일반 테이블로 JSON 데이터를 전송하기 위해 더 좋을 것 다시 만들 당신이 그것을 필요로 할 때 JSON을.

    정규화 지시의 첫 번째 규칙은, 결코 하나 개의 컬럼에 정보 하나 이상의 비트를 저장할 수 없습니다. 당신은 "미키 마우스"와 같은 값을 가진 열 "으로 PersonName"을 참조하십시오? 이와 외침을 가리 : 변경을 즉시 것을!

    무엇 XML 또는 JSON에 대해? 이러한 유형의 1.NF을 파괴하고 있는가? 음, 그래 더 ... 없습니다

    1 비트의 정보가 사실 인 경우 1 비트의 정보로 완벽한 구조를 저장하기 위해 완벽하게 괜찮습니다. 당신은 SOAP 응답을 얻을하고 (하지만 당신은 자신의 프로세스에이 데이터를 사용하지 않습니다) 미래 참조 할 수 있도록이 필요할 수 있기 때문에 저장 하시겠습니까? 그냥있는 그대로 보관!

    이제 (해당 주소, 자세한 ...에) 사람을 대표하는 복잡한 구조 (XML 또는 JSON)을 상상한다. 지금 당신은 PersonInCharge 하나 열이 점을 넣어. 이 잘못인가? 대신 XML / JSON의 외래 키를 참조하여 적절하게 설계 관련 테이블에서이 아니라 살아있는해야하지? 같은 사람이 여러 행에 발생할 수 있습니다 특히 경우는 XML / JSON 접근 방식을 사용하는 것이 분명히 잘못된 것입니다.

    하지만 지금은 기록 데이터를 저장할 필요가 상상. 당신은 시간에 주어진 순간 그 사람의 데이터를 유지하고자합니다. 몇 일 후 사람이 새 주소를 알려줍니다? 문제 없어요! 는 XML의 이전 주소의 삶 / JSON 혹시 필요하면 ...

    결론 : 당신은 데이터를 저장하는 경우 그냥 괜찮아, 그것을 유지합니다. 이 데이터는 고유 한 부분 인 경우, 괜찮아 ... 당신이 정기적으로 또는 경우 내부 부품이 필요하지만이 괜찮 아니라 중복 중복 저장을 의미 할 것입니다 ...

    다음은 SQL Server 용이며, 다른 RDBMS에 다를 수 있습니다.

    XML은 당신이 볼 수있는 텍스트로 저장하지만, 계층 구조 트리로하지 않습니다. 쿼리이 놀랄만큼 잘 수행! 이 구조는 현 수준에서 해석되지 않는다! SQL 서버 (2016+)에서 JSON 문자열에 살고 구문 분석해야합니다. 실제 네이티브 JSON 유형 (원시 XML 형식이 같은)이 없습니다. 이것은 나중에 올 수도 있지만, 지금은 내가 JSON은 SQL 서버 (섹션 UPDATE 2 참조)에 XML로 확대됨으로 수 없음을, 가정 것입니다. JSON의 값을 읽어 할 필요는 숨겨진 문자열 메소드 호출의 많은 지옥이 필요합니다 ...

    당신의 사랑스러운 DB 아티스트 - D는 JSON을 저장하는대로 것을 알고

  2. ==============================

    2.이것은 너무 오래 코멘트입니다.

    이것은 너무 오래 코멘트입니다.

    이 "절대적으로 잘못"했다 경우, 대부분의 데이터베이스가이를 지원하지 않을 것입니다. 좋아, 대부분의 데이터베이스는 FROM 절에 쉼표를 지원하고 내가 "절대적으로 잘못된"로 그것을 볼 수 있습니다. 그러나 JSON에 대한 지원은 새로운 개발이 아닌 - 이전 버전과 호환 "기능"입니다.

    json으로 구조체는 단순히 응용 프로그램에 다시 전달되는 BLOB 때 한 명백한 경우입니다. 그때 다른 모든 레코드에 공통 필드 구성에 대한 상세한 데이터를 불필요하다 JSON을 저장하는 오버 헤드 - 일절 논의는 없다.

    또 다른 경우는 "스파 스"열 경우입니다. 당신은 가능한 많은 열이있는 행을 가지고 있지만, 이러한 행의 행에 따라 달라집니다.

    당신이 레코드의 "중첩"레코드를 저장하고자 할 때 또 다른 경우이다. JSON은 강력하다.

    json으로 당신에 조회 할 것을 기록에서 공통 필드가있는 경우에, 당신은 일반적으로 더 적절한 데이터베이스 열이 퍼팅 꺼져 있습니다. 그러나 데이터가 복잡 및 JSON과 같은 형식을위한 장소가있다.

  3. ==============================

    3.내 마술 지팡이를 흔들 것이다. 휙! JSON의 사용에 골든 규칙 :

    내 마술 지팡이를 흔들 것이다. 휙! JSON의 사용에 골든 규칙 :

    응용 프로그램을 진술; 어쩌면 우리는 더 구체적으로 할 수 있습니다.

  4. ==============================

    4.새로운 SQL Server는 JSON 텍스트를 처리하는 기능을 제공합니다. JSON으로 포맷 된 정보는 표준 SQL Server 열의 텍스트로 저장 될 수 있으며, SQL Server는 이러한 JSON 객체에서 값을 검색 할 수있는 기능을 제공합니다.

    새로운 SQL Server는 JSON 텍스트를 처리하는 기능을 제공합니다. JSON으로 포맷 된 정보는 표준 SQL Server 열의 텍스트로 저장 될 수 있으며, SQL Server는 이러한 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 )
     )
    

    이 간단한 구조는 방금 JSON을 나타내는 ID를 나타내는 키와 값이되는 NoSQL 데이터베이스 (예를 들어, 푸른 DocumentDB 또는 MongoDB를)에서 만들 수있는 표준 NoSQL의 수집과 유사하다.

    NVARCHAR 그냥 일반 텍스트 아닙니다. SQL Server를 내장하고 투명하게 압축 데이터가 디스크에 저장 할 수있는 텍스트 압박 메커니즘. 압축은 언어에 따라 달라집니다 및 데이터 (유니 코드 압축 참조)에 따라 최대 50 %까지 갈 수 있습니다.

    SQL 서버 및 기타 일반되는 NoSQL 데이터베이스 사이의 주요 차이점은 SQL 서버 당신이 동일한 "수집"여러 JSON 객체를 저장하고 일반 관계형 열로 결합 할 수 있습니다 하이브리드 데이터 모델을 사용할 수 있다는 것입니다.

    예를 들어, 우리가 컬렉션에 모든 사람이 이름 및 성있을 것이라는 점을 알고 상상, 당신은 별도의 객체로 일반적으로 한 JSON 객체와 사람에 대한 정보, 전화 번호 / 이메일 주소를 저장할 수있다. SQL 서버 2016에서 우리는 쉽게 추가 구문없이 구조를 만들 수 있습니다 :

    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 컬럼의 구조를 확인하지 않으려면 (이 예에서는 난 단지 EmailAddresses 열에 CHECK 제약 조건을 추가 한) 모든 열을 JSON 점검 제한 조건을 추가 할 필요가 없습니다.

    당신은 표준 NoSQL의 컬렉션이 구조를 비교하면, 당신은 당신이 강력한 형식의 데이터 (이름 및 성)에 빠르게 액세스 할 수 있음을 알 수 있습니다. 따라서,이 솔루션은 JSON으로 저장 될 수있는 모든 객체에 걸쳐 반복되는 몇 가지 정보를 식별 할 수있는 하이브리드 모델, 및 기타 변수 정보에 대한 좋은 선택이 될 것입니다. 이 방법을 사용하면 유연성과 성능을 결합 할 수 있습니다.

    당신은 사람이 테이블 AdventureWorks 데이터베이스의 스키마와이 구조를 비교하면, 당신은 우리가 많은 관련 테이블을 제거했는지 알 수 있습니다.

    스키마의 단순 옆에, 당신의 데이터는 작업이 복잡한 관계 구조에 비해 간단합니다 액세스 할 수 있습니다. 지금 당신은 대신 여러 테이블을 조인의 단일 테이블을 읽을 수 있습니다. 당신이 관련 정보와 새로운 사람 (이메일 주소, 전화 번호)를 삽입해야 할 때 매장 전화에 사용되는 외부 키를 찾기 위해 ID 열을 복용 한 테이블 대신하여 AdventureWorks Person 테이블에서 하나 개의 레코드를 삽입하는 하나의 레코드를 삽입 할 수 있습니다 등 이메일 주소, 또한이 모델에서 당신은 쉽게 외래 키 관계를 이용하여 캐스케이드 삭제하지 않고 한 사람의 행을 삭제할 수 있습니다.

    되는 NoSQL 데이터베이스가 읽기 간단하고, 삽입 및 삭제 작업에 최적화되어 있습니다 - SQL 서버 2016는 관계형 데이터베이스에서 같은 논리를 적용 할 수 있습니다.

    JSON 제약 앞의 예에서 우리는 열에 저장된 텍스트가 제대로 포맷의 유효성을 검사 간단한 제약 조건을 추가하는 방법을 보았다. JSON 강한 스키마가 없지만, 당신은 또한 JSON 및 표준 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}')
    

    당신이 빠른 쓰기 성능을 필요로하는 경우 당신이 그들을 피할 수 있도록주의 CHECK 제약 조건은 삽입 / 업데이트 프로세스를 늦출 수 있음.

    압축 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 내용을 이해 예 : 브라우저) Gzip 압축을 처리 할 수 ​​있다면, 당신은 직접 압축 된 내용을 반환 할 수 있습니다. 이 성능 / 저장 트레이드 오프 유의하십시오. 자주 쿼리 데이터를 압축하면 텍스트가 각각의 시간을 압축 해제해야하기 때문에 속도가 느린 성능을 MIG.

    참고 : JSON 기능은 SQL 서버 2016+와 푸른 SQL 데이터베이스에서 사용할 수 있습니다.

    더이 문서의 소스에서 읽을 수 있습니다

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

  5. ==============================

    5.은 "황금률"나는 길의 손으로 웨이브 형 일종의 사용, 나는 원시 형식으로 JSON을 필요로하는 경우, 그것은 저장소에 괜찮아 것입니다. 나는 그것을 구문 분석의 특별한 지점을해야하는 경우, 그것은 아니다.

    은 "황금률"나는 길의 손으로 웨이브 형 일종의 사용, 나는 원시 형식으로 JSON을 필요로하는 경우, 그것은 저장소에 괜찮아 것입니다. 나는 그것을 구문 분석의 특별한 지점을해야하는 경우, 그것은 아니다.

    나는 원시 JSON을 전송하고,이 값이 변화하지 않을 어떤 이유에 대한 API를 만드는거야 경우 예를 들어, 다음은 원시 JSON으로 저장 괜찮습니다. 나는 그것을 구문 분석 할 수있는 경우에, 그다지 ... 등, 변경을 업데이트합니다.

  6. ==============================

    6.당신이 요청해야하는 질문은 :

    당신이 요청해야하는 질문은 :

    하다

    DO NOT

  7. ==============================

    7.JSON 년대는 relationional 데시벨의 큰되지 않습니다. 당신은 DB의 열 저장에 JSON을 전개 경우, 중대하지만 덩어리로 JSON을 저장하는 데이터 보관 시스템으로 사용 옆에 있습니다.

    JSON 년대는 relationional 데시벨의 큰되지 않습니다. 당신은 DB의 열 저장에 JSON을 전개 경우, 중대하지만 덩어리로 JSON을 저장하는 데이터 보관 시스템으로 사용 옆에 있습니다.

    아닌 JSON을 전개하고 단일 컬럼에 저장하지만 JSON 필드의 값이 어떤 쿼리에 사용되지 않을 것 (또는 값이 이미 컬럼에 전개 된)로 결정이 촬영 한 것입니다 몇 가지 이유가있을 수 있습니다.

    또한, JSON 처리의 대부분의 SQL 단지 JSON 처리를 위해 의미되지 않기 때문에 SQL 환경 외부 것이다 쿼리 된 모든 필드의 경우. 내가이 JSON을 저장 않습니다 다음이 될 진짜 문제는, 난 그냥 플랫 파일로하자 및 않습니다 (스파크 / 하이브 / 등) 다른 시스템을 통해 쿼리를 그들에게 필요할 때.

    내가 보관을위한 RDBMS를 사용하지 않는, 당신의 DB 아티스트에 동의합니다. 싼 옵션이 있습니다. 또한 JSON 모양은 거대한 얻을 수와 시간에 DB의 디스크 공간을 늦추지 시작할 수 있습니다.

  8. ==============================

    8.PostgreSQL을가 내장 된 JSON과 jsonb 데이터 유형

    PostgreSQL을가 내장 된 JSON과 jsonb 데이터 유형

    다음은 몇 가지 예입니다 :

    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}}'
     );
    

    쿼리 JSON 데이터를 >> - PostgreSQL은 두 개의 기본 연산자를 제공합니다 ->합니다.

    운영자는 -> 키를 사용하여 JSON 오브젝트 필드를 반환합니다.

    운영자는 - >> 텍스트로 JSON 개체 필드를 반환합니다.

    SELECT
     info -> 'customer' AS customer
    FROM
     orders;
    
    SELECT
     info ->> 'customer' AS customer
    FROM
     orders
    WHERE
     info -> 'items' ->> 'product' = 'Diaper'
    
  9. from https://stackoverflow.com/questions/43494824/when-can-i-save-json-or-xml-data-in-an-sql-table by cc-by-sa and MIT license