롤 토토 : 문서 : 9.5 : 롤 토토 9.5 | |||
---|---|---|---|
PostgreSQL : 문서 : 9.5 : 토토 사이트 추천 유형 | PostgreSQL : 문서 : 9.5 : 데이터 토토 커뮤니티 | 8 장 데이터 유형 | PostgreSQL : 문서 : 9.5 : 배트맨 토토 |
무지개 토토 데이터 유형은 무지개 토토 (javaScript 객체 표기법) 데이터를 저장하는 것입니다.RFC 7159. 이러한 데이터는로 저장 될 수 있습니다.텍스트, 그러나 무지개 토토 데이터 유형은 무지개 토토 규칙에 따라 각 저장된 값이 유효하다는 것을 시행 할 수 있습니다. 또한 이러한 데이터 유형에 저장된 데이터에 사용할 수있는 다양한 무지개 토토- 특이 적 기능 및 연산자가 있습니다. 보다43_[1,2,3] |[1,2,3] 무지개 토토 사이트.
두 가지 무지개 토토 데이터 유형이 있습니다 :무지개 토토및무지개 토토B. 그들은 받아 들여거의입력과 동일한 값 세트. 실질적인 차이점은 효율성 중 하나입니다. 그만큼무지개 토토데이터 유형은 입력 텍스트의 정확한 사본을 저장하며, 이는 각 실행에 따라 처리 함수가 다시 시작되어야합니다. 하는 동안무지개 토토B데이터는 분해 된 이진 형식으로 저장되어 전환 오버 헤드가 추가되어 입력이 약간 느리게 만들지 만 재구성이 필요하지 않기 때문에 처리하기가 훨씬 빠릅니다.무지개 토토B또한 인덱싱을 지원합니다. 이는 상당한 이점이 될 수 있습니다.
왜냐하면무지개 토토입력은 입력 텍스트의 정확한 사본을 저장하면 토큰 사이의 의미 적으로 유의 한 공백과 무지개 토토 객체 내의 키 순서를 보존합니다. 또한 값의 무지개 토토 객체에 동일한 키가 두 번 이상 포함되면 모든 키/값 쌍이 유지됩니다. (처리 함수는 마지막 값을 조작 값으로 간주합니다.) 대조적으로무지개 토토B공백을 보존하지 않고 객체 키의 순서를 보존하지 않으며 중복 객체 키를 유지하지 않습니다. 중복 키가 입력에 지정되면 마지막 값 만 유지됩니다.
일반적으로 대부분의 응용 프로그램은 무지개 토토 데이터를로 저장하는 것을 선호해야합니다.무지개 토토B, 객체 키 순서에 대한 레거시 가정과 같은 전문적인 요구가 없다면.
PostgreSQL데이터베이스 당 하나의 문자 세트 만 인코딩 할 수 있습니다. 따라서 데이터베이스 인코딩이 UTF8이 아닌 한 무지개 토토 유형은 무지개 토토 사양에 엄격하게 준수 할 수 없습니다. 데이터베이스 인코딩에 표시 할 수없는 문자를 직접 포함시키려는 시도는 실패합니다. 반대로, 데이터베이스 인코딩에서 표현할 수 있지만 UTF8에서는 그렇지 않은 문자가 허용됩니다.
RFC 7159 무지개 토토 스트링은 유니 코드 이스케이프 시퀀스를 포함 할 수 있습니다.\ uxxxx. 의 입력 함수에서무지개 토토유형, 유니 코드 이스케이프는 데이터베이스 인코딩에 관계없이 허용되며 구문 적 정확성 만 확인합니다 (즉, 4 개의 16 진수가 따르는 4 개의 16 진수 숫자는\ u). 그러나에 대한 입력 함수무지개 토토B더욱 엄격합니다 : 비 ASCII 문자에 대한 유니 코드 탈출을 분해합니다 (위U+007f) 데이터베이스 인코딩이 UTF8이 아닌 한. 그만큼무지개 토토B유형도 거부\ u0000PostgreSQL's텍스트type), 유니 코드 기본 다국어 평면 외부의 문자를 지정하기 위해 유니 코드 대리 쌍을 사용하는 것이 정확하다고 주장합니다. 유효한 유니 코드 이스케이프는 스토리지와 동등한 ASCII 또는 UTF8 문자로 변환됩니다. 여기에는 단일 문자로 대리 쌍을 접는 것이 포함됩니다.
참고 :많은 무지개 토토 처리 기능에 설명 된43_[1,2,3] |[1,2,3] 무지개 토토 사이트유니 코드 에스케이프를 일반 문자로 변환하므로 입력이 유형이더라도 설명 된 동일한 유형의 오류를 던질 것입니다무지개 토토아님무지개 토토B. 사실무지개 토토입력 함수는 이러한 점검이 역사적 아티팩트로 간주 될 수 있지만, 비우프 8 데이터베이스 인코딩에서 무지개 토토 유니 코드 탈출의 간단한 스토리지 (처리없이)를 허용 할 수 있습니다. 일반적으로 무지개 토토에서 유니 코드 탈출을 비 UTF8 데이터베이스 인코딩과 혼합하는 것을 피하는 것이 가장 좋습니다.
텍스트 무지개 토토 입력을 변환 할 때무지개 토토B,,.RFC7159는 효과적으로 네이티브에 매핑됩니다PostgreSQL유형, 참조표 8-23. 따라서 유효한 구성 요소에 대한 약간의 추가 제약이 있습니다무지개 토토B적용되지 않는 데이터무지개 토토기본 데이터 유형으로 표현할 수있는 내용에 대한 제한에 해당하는 초록의 유형 또는 무지개 토토에. 특히,무지개 토토B외부에있는 숫자를 거부합니다.postgresql 숫자데이터 유형, while무지개 토토그렇지 않습니다. 이러한 구현 정의 제한은에 의해 허용됩니다.RFC7159. 그러나 실제로 이러한 문제는 무지개 토토을 대표하는 것이 일반적이므로 다른 구현에서 발생할 가능성이 훨씬 높습니다.번호IEEE 754 이중 정밀 부유 포인트로의 원시 유형 (whoRFC7159 명시 적으로 예상하고 허용합니다). 무지개 토토을 이러한 시스템과의 교환 형식으로 사용하는 경우 원래 저장된 데이터에 비해 숫자 정밀도를 잃을 위험이PostgreSQL고려해야합니다.
반대로, 테이블에 언급 된 바와 같이, 해당 무지개 토토 원시 유형의 입력 형식에 약간의 제한이 있습니다PostgreSQL타입.
표 8-23. 무지개 토토 원시 유형 및 해당PostgreSQL유형
무지개 토토 원시 유형 | PostgreSQL타입 | 노트 |
---|---|---|
String | 텍스트 | \ u0000데이터베이스 인코딩이 UTF8이 아닌 경우 비 ASCII 유니 코드 탈출과 마찬가지로 허용되지 않습니다. |
번호 | 숫자 | NANandInfinity값은 허용되지 않습니다 |
부울 | 부울 | 소문자 만trueand거짓철자가 허용됩니다 |
NULL | (없음) | SQLNULL다른 개념입니다 |
무지개 토토 데이터 유형의 입력/출력 구문은RFC 7159.
다음은 모두 유효합니다무지개 토토(또는무지개 토토B) 표현 :
- 간단한 스칼라/원시 값 - 원시 값은 숫자, 인용 문자열, 참, 거짓 또는 null 일 수 있습니다. 선택 '5':: 무지개 토토; - 0 이상의 요소 배열 (요소가 같은 유형 일 필요는 없음) '[1, 2, "foo", null] :: json을 선택하십시오. - 키와 값 쌍을 포함하는 객체 - 객체 키는 항상 문자열이어야합니다. 선택 ' "bar": "baz", "balance": 7.77, "active": false':: json; - 배열 및 객체는 임의로 중첩 될 수 있습니다 ' "foo": [true, "bar"], "tags": "a": 1, "b": null':: json;를 선택하십시오.
앞에서 언급 한 바와 같이, 무지개 토토 값이 입력되고 추가 처리없이 인쇄 될 때무지개 토토입력 한 것과 동일한 텍스트를 출력하는 동안무지개 토토BWhitespace와 같은 의미 적으로 유의 한 세부 사항을 보존하지 않습니다. 예를 들어, 차이점에 주목하십시오.
선택 ' "bar": "baz", "balance": 7.77, "active": false':: json; 무지개 토토 ------------------------------------------------------------- "bar": "baz", "balance": 7.77, "active": false
주목할만한 의미있는 세부 사항 중 하나는입니다.무지개 토토B, 숫자는 기본 행동에 따라 인쇄됩니다숫자타입. 실제로 이것은 숫자로 입력 된 숫자를 의미합니다.e표기법은 예를들없이 인쇄됩니다.
선택 ' "읽기": 1.230e-5':: json, ' "reading": 1.230e-5':: jsonb; 무지개 토토 | 무지개 토토B ----------------------------------------------------------- "읽기": 1.230e-5 | "읽기": 0.00001230
그러나무지개 토토B이 예에서 볼 수 있듯이 평등 점검과 같은 목적으로 의미 적으로 중요하지 않더라도이 예에서 볼 수 있듯이 후행 분수 제로를 보존 할 것입니다.
무지개 토토으로서 데이터를 표현하는 것은 요구 사항이 유동적 인 환경에서 강력한 기존 관계 데이터 모델보다 상당히 유연 할 수 있습니다. 동일한 응용 프로그램 내에서 두 가지 접근 방식이 공존하고 서로를 보완 할 수 있습니다. 그러나 최대 유연성이 필요한 애플리케이션의 경우에도 무지개 토토 문서는 다소 고정 된 구조를 갖는 것이 좋습니다. 구조는 일반적으로 강화되지 않지만 (일부 비즈니스 규칙을 선언 적으로 시행 할 수 있지만) 예측 가능한 구조를 사용하면 세트를 유용하게 요약하는 쿼리를 쉽게 작성하는 것이 더 쉽습니다."문서"(Datums) 테이블.
무지개 토토 데이터는 테이블에 저장 될 때 다른 데이터 유형과 동일한 동시성 제어 고려 사항이 적용됩니다. 큰 문서를 저장하는 것이 실제로 가능하지만, 모든 업데이트는 전체 행에서로드 레벨 잠금을 취득합니다. 업데이트 거래 간의 잠금 경합을 줄이기 위해 무지개 토토 문서를 관리 가능한 크기로 제한하는 것을 고려하십시오. 이상적으로, 무지개 토토 문서는 각각 비즈니스 규칙이 독립적으로 수정 될 수있는 더 작은 데이텀으로 합리적으로 세분화 될 수없는 원자 기준을 나타내야합니다.
테스트격리의 중요한 기능입니다.무지개 토토B. 에 대한 평행 시설 세트가 없습니다.무지개 토토타입. 격리는 하나 의지 테스트합니다무지개 토토B문서는 다른 내부에 포함되어 있습니다. 이 예제는 언급 된대로 다음을 제외하고 참으로 반환됩니다.
- 간단한 스칼라/원시 값은 동일한 값 만 포함합니다. ' "foo"':: jsonb @ ' "foo"':: jsonb를 선택하십시오. - 오른쪽의 배열은 왼쪽의 배열 내에 포함되어 있습니다. '[1, 2, 3]':: jsonb @ '[1, 3]':: jsonb를 선택하십시오. - 배열 요소의 순서는 중요하지 않으므로 이것은 사실입니다. '[1, 2, 3]':: 무지개 토토B @ '[3, 1]':: 무지개 토토B; - 중복 배열 요소도 중요하지 않습니다. '[1, 2, 3]':: 무지개 토토B @ '[1, 2, 2] :: 무지개 토토B를 선택하십시오. - 오른쪽에 단일 쌍이있는 객체가 포함되어 있습니다. - 왼쪽의 물체 내에서 : ' "product": "postgresql", "버전": 9.4, "jsonb": true':: jsonb @ ' "버전": 9.4':: jsonb; - 오른쪽의 배열은입니다.not- 비슷한 배열이 그 안에 중첩되어 있어도 왼쪽의 배열 : '[1, 2, [1, 3]]':: jsonb @ '[1, 3] :: jsonb; - 거짓을 생성합니다 - 그러나 둥지 층이 있으면 포함됩니다. '[1, 2, [1, 3]]':: 무지개 토토B @ '[[1, 3]]':: 무지개 토토B; - 마찬가지로, 격리는 여기에보고되지 않습니다. ' "foo": "bar": "baz"':: jsonb @ ' "baz": "baz"':: jsonb; - 거짓을 생성합니다 -최상위 키와 빈 객체가 포함되어 있습니다. ' "foo": "bar": "baz"':: jsonb @ ' "foo": ':: jsonb;를 선택하십시오.
일반적인 원칙은 포함 된 객체가 포함 된 객체가 구조 및 데이터 내용과 관련하여 포함 된 객체와 일치해야한다는 것입니다. 그러나 배열 요소의 순서는 격리 일치를 할 때 중요하지 않으며 중복 배열 요소는 한 번만 효과적으로 고려됩니다.
구조가 일치해야한다는 일반적인 원칙에 대한 특별한 예외로서 배열에는 원시적 값이 포함될 수 있습니다.
-이 배열은 원시 문자열 값을 포함합니다. '[ "foo", "bar"]':: jsonb @ ' "bar"':: jsonb를 선택하십시오. -이 예외는 상호 적이 아닙니다.-비 함유는 다음과 같습니다. ' "bar"':: jsonb @ '[ "bar"]':: jsonb를 선택하십시오. - 거짓
무지개 토토B또한존재운영자, 이는 격리 주제의 변형 : 문자열 (A 여부를 테스트합니다.텍스트value)의 상단 레벨에서 객체 키 또는 배열 요소로 나타납니다.무지개 토토B값. 이 예제는 언급 된대로 다음을 제외하고 참으로 반환됩니다.
- 문자열은 배열 요소로 존재합니다. '[ "foo", "bar", "baz"]':: jsonb를 선택하십시오. '술집'; - 문자열은 객체 키로 존재합니다. ' "foo": "bar"':: 무지개 토토B를 선택하십시오. 'foo'; - 객체 값은 고려되지 않습니다. ' "foo": "bar"':: 무지개 토토B를 선택하십시오. '술집'; - 거짓을 생성합니다 - 격리와 마찬가지로 존재는 최상위 수준에서 일치해야합니다. ' "foo": "bar": "baz"':: 무지개 토토B를 선택하십시오. '술집'; - 거짓을 생성합니다 - 프리미티브 무지개 토토 문자열과 일치하는 경우 문자열이 존재하는 것으로 간주됩니다. ' "foo"':: 무지개 토토B를 선택하십시오. 'foo';
무지개 토토 객체는 많은 키나 요소가있을 때 격리 또는 존재를 테스트하기 위해 배열보다 더 적합합니다. 배열과 달리 검색을 위해 내부적으로 최적화되어 있고 선형으로 검색 할 필요가 없기 때문입니다..
팁 :무지개 토토 격리가 중첩되어 있으므로 적절한 쿼리는 명시적인 하위 관류 선택을 건너 뛸 수 있습니다. 예를 들어, 우리에게가 있다고 가정합니다.doc최상위에 객체를 포함하는 열 대부분의 객체가 포함되어 있습니다태그하위 객체 배열이 포함 된 필드. 이 쿼리는 서브 객체가 두 가지를 포함하는 항목을 찾습니다."용어": "파리"and"용어": "음식"나타나면서 외부에서 그러한 키를 무시하면서태그배열 :
웹 사이트에서 doc- 'site_name'을 선택하십시오 여기서 doc @ ' "tags": [ "term": "paris", "term": "food"]';하나는 같은 것을 성취 할 수 있습니다.
웹 사이트에서 doc- 'site_name'을 선택하십시오 여기서 doc- 'tag' @ '[ "term": "Paris", "term": "food"]';그러나 그 접근법은 덜 유연하고 종종 덜 효율적입니다.
반면에 무지개 토토 존재 연산자는 중첩되지 않았습니다. 무지개 토토 값의 최상위 레벨에서 지정된 키 또는 배열 요소 만 찾습니다.
다른 모든 무지개 토토 연산자 및 기능과 함께 다양한 격리 및 존재 연산자가 문서화되어 있습니다.43_[1,2,3] |[1,2,3] 무지개 토토 사이트.
진 인덱스는 많은 수의 내에서 발생하는 키 또는 키/값 쌍을 효율적으로 검색하는 데 사용될 수 있습니다.무지개 토토B문서 (Datums). 두 진"운영자 클래스"다른 성능과 유연성 트레이드 오프를 제공하는 제공됩니다.
기본 진 운영자 클래스무지개 토토B최상위 키 존재 연산자와 함께 쿼리를 지원합니다?, ? &and? |운영자 및 PATH/Value-Exists Operator@. (이 운영자가 구현 한 의미론에 대한 자세한 내용은 참조표 9-41.)이 연산자 클래스와 인덱스를 생성하는 예는 다음과 같습니다.
gin (jdoc)을 사용하여 API에서 색인 Idxgin 생성;
비 디펜트 진 운영자 클래스무지개 토토B_PATH_OPS인덱싱 지원@운영자 만. 이 연산자 클래스로 인덱스를 만드는 예는 다음과 같습니다.
gin (jdoc jsonb_path_ops)을 사용하여 API에서 색인 IdxGinp 만들기;
문서화 된 스키마 정의와 함께 타사 웹 서비스에서 검색된 무지개 토토 문서를 저장하는 테이블의 예를 고려하십시오. 일반적인 문서는 다음과 같습니다.
"GUID": "9C36ADC1-7FB5-4D5B-83B4-90356A46061A", "이름": "Angela Barton", "is_active": 사실, "회사": "magnafone", "주소": "178 Howard Place, Gulf, Washington, 702", "등록": "2009-11-07T08 : 53 : 22 +08 : 00", "위도": 19.793713, "경도": 86.513373, "태그": [ "enim", "aliquip", "Qui" ]]
우리는이 문서들을 명명 된 표에 저장합니다API, in무지개 토토B열이라는 열jdoc. 이 열에서 진 인덱스가 생성되면 다음과 같은 쿼리는 색인을 사용할 수 있습니다.
- 키 "회사"가 가치 "magnafone"을 갖는 문서 찾기 JDOC- 'GUID', JDOC- 'Name'을 선택하여 API에서 jdoc @ ' "회사": "magnafone"';를 선택하십시오.
그러나 연산자이기 때문에 다음과 같은 쿼리에는 인덱스를 사용할 수 없습니다?색인이 가능하며 색인 된 열에 직접 적용되지 않습니다jdoc:
- 키 "태그"에 키 또는 배열 요소 "qui"가 포함 된 문서 찾기 JDOC- 'GUID', JDOC- '이름'을 선택하여 API에서 JDOC- 'TAGS'를 선택하십시오. 'qui';
여전히 표현식 인덱스를 적절하게 사용하면 위의 쿼리가 인덱스를 사용할 수 있습니다. 내 특정 항목에 대한 쿼리 인 경우"태그"키는 일반적입니다. 이와 같이 인덱스를 정의하는 것이 가치가있을 수 있습니다 :
gin을 사용하여 API에서 index idxgintags 생성 ((jdoc - 'tags');
지금,여기서절jdoc- 'tags'? 'qui'인덱스 가능한 연산자의 응용 프로그램으로 인식됩니다?색인 표현식jdoc- 'tags'. (표현 인덱스에 대한 자세한 내용은 참조 할 수 있습니다.PostgreSQL : 문서 : 9.5 : 와이즈 토토 색인.)
쿼리에 대한 또 다른 접근 방식은 격리를 악용하는 것입니다.
- 키 "태그"에 배열 요소가 포함 된 문서 찾기 "qui" jdoc- 'guid', jdoc- 'name'을 선택하여 api @ ' "tags": [ "qui"]';
jdoc열 에서이 쿼리를 지원할 수 있습니다. 그러나 그러한 색인은 모든 키의 사본과에을 저장합니다.jdoc열, 이전 예제의 표현 인덱스는에서 발견 된 데이터 만 저장합니다.태그키. Simple-Index 접근 방식은 훨씬 유연하지만 (모든 키에 대한 쿼리를 지원하므로) 대상 표현식 인덱스는 단순한 인덱스보다 검색이 더 작고 빠를 수 있습니다..
비록무지개 토토B_PATH_OPS운영자 클래스는와의 쿼리 만 지원합니다.@운영자, 기본 연산자 클래스에 비해 주목할만한 성능 이점이 있습니다무지개 토토B_OPS. 에이무지개 토토B_PATH_OPS색인은 일반적으로 a보다 훨씬 작습니다무지개 토토B_OPS동일한 데이터를 통한 색인 및 특히 쿼리에 데이터에 자주 나타나는 키가 포함 된 경우 검색의 특이성이 더 좋습니다. 따라서 검색 작업은 일반적으로 기본 연산자 클래스보다 더 잘 수행됩니다.
a의 기술적 차이무지개 토토B_OPS및 A무지개 토토B_PATH_OPSGin Index는 전자가 각 키에 대한 독립적 인덱스 항목과 데이터의 값을 생성하는 반면, 후자는 데이터의 각 값에 대해 인덱스 항목 만 생성한다는 것입니다.[1]기본적으로 각무지개 토토B_PATH_OPS색인 항목은 값의 해시이며이를 이끌어냅니다. 예를 들어 색인"foo": "bar": "baz"foo, bar및BAZ해시 값으로. 따라서이 구조를 찾는 격리 쿼리는 매우 구체적인 색인 검색을 초래할 것입니다. 그러나 전혀 알 수있는 방법이 없습니다foo열쇠로 나타납니다. 반면에, a무지개 토토B_OPSindex는 대표하는 3 개의 색인 항목을 생성합니다foo, bar및BAZ별도로; 그런 다음 격리 쿼리를 수행하려면 세 가지 항목 모두가 포함 된 행을 찾습니다. GIN 인덱스는 그러한 AN을 수행하고 검색을 상당히 효율적으로 수행 할 수 있지만, 여전히 그와 동등한 것보다 덜 구체적이고 느리게무지개 토토B_PATH_OPS검색, 특히 세 가지 색인 항목 중 하나를 포함하는 매우 많은 행이있는 경우
의 단점무지개 토토B_PATH_OPS접근 방식은 값과 같은 값을 포함하지 않는 무지개 토토 구조에 대한 인덱스 항목을 생성하지 않는다는 것입니다."a":. 이러한 구조가 포함 된 문서를 검색하는 경우 전체 인덱스 스캔이 필요합니다. 이는 매우 느립니다.무지개 토토B_PATH_OPS따라서 종종 그러한 검색을 수행하는 응용 프로그램에 적합하지 않습니다.
무지개 토토B지원btree및Hash인덱스. 이는 일반적으로 완전한 무지개 토토 문서의 평등을 확인하는 것이 중요하다면 유용합니다. 그만큼btree주문무지개 토토BDatums는 거의 관심이 거의 없지만 완전성은 다음과 같습니다.
개체 배열 부울 번호 String null n 쌍을 가진 객체 n -1 쌍을 가진 객체 n 요소가있는 배열 n -1 요소가있는 배열
쌍의 수가 같은 객체는 순서대로 비교됩니다.
KEY-1, value-1, key-2 ...
개체 키는 스토리지 순서로 비교됩니다. 특히, 더 짧은 키가 더 긴 키 전에 저장되므로 :과 같은 직관적이지 않은 결과로 이어질 수 있습니다.
"aa": 1, "c": 1 "b": 1, "d": 1
마찬가지로, 요소가 같은 숫자를 가진 배열은 순서대로 비교됩니다.
Element-1, Element-2 ...
원시 무지개 토토 값은 기본과 동일한 비교 규칙을 사용하여 비교됩니다PostgreSQL데이터 유형. 문자열은 기본 데이터베이스 Collation을 사용하여 비교됩니다.
[1] |
이 목적의 경우 용어"value"배열 요소가 포함되지만 무지개 토토 용어는 때때로 객체 내의 값과 구별되는 배열 요소를 고려합니다. |