NoSQL for the Enterprise

EDB 관계형 QT

기업용 Postgres NoSQL은 어떤 제품입니까?

Postgres NoSQL은 비정형 데이터베이스 기술과 관계형 데이터베이스 기술을 엔터프라이즈 데이터베이스 관리 시스템 하나에 통합한 강력한 솔루션입니다. Postgres NoSQL은 엔터프라이즈 정보의 장기적 실행능력을 제공하면서 동시에 비정형 데이터와 반정형 데이터를 모두 취급할 수 있는 자유, 유연성 및 성능을 제공합니다.

Postgres 문서 및 키 값 저장 기술은 새로운 NoSQL 기술의 장점은 물론 데이터 사일로, 운영 복잡성, 데이터 무결성 저하, 리스크 없이 기존의 기업용 데이터 인프라에 통합할 수 있는 기능까지 지원합니다.

 

완전한 문서 데이터베이스

Postgres는 최고의 JSON 환경과 성능이 입증된 ACID 트랜잭션 엔진을 결합했습니다. 이 조합을 통해 사용자들은 가장 경제적이고 성능이 입증된 플랫폼을 기반으로 한 최고의 워크로드 유연성을 누릴 수 있도록 해줍니다.

오늘날 완벽한 데이터베이스 솔루션의 요건은 다음과 같습니다. (1)트랜잭션 무결성 보장, (2)데이터 용량 급증, 데이터 속도 및 처리속도 증가, 계속 늘어나고 있는 데이터 형식 처리 보장. 이러한 요건을 포함한 신기술들이 부상하고 있으나 한 분야에 치중한 나머지 다른 분야를 포기하는 경우가 많습니다.

JSON을 포함한 Postgres는 사용자 요구를 적극 반영해 대부분의 NoSQL 워크로드를 더욱 성공적으로 처리합니다. 자세한 사항은 백서 'PostgreSQL Advances to Meet NoSQL Challenges'를 참고하십시오

 

ACID냐 BASE냐?

데이터베이스 기술의 핵심인 ACID(원자성, 일관성, 고립성, 지속성) 표준에 부합한다는 것은 기업의 가장 소중한 자원인 데이터가 유효성, 일관성, 안정성을 포함하고 있음을 말합니다. 독립실행형 NoSQL 기술은 비정형 어플리케이션에서 높은 처리속도를 구현하다보니 중요 데이터 보호 성능이 떨어져 ACID 표준에 부합하지 않습니다. 그 대신, BASE(Basic Availability, Soft State and Eventual Consistency)에 부합합니다. 이 기준은 텍스트 메시지 분실이나 멀티플레이어 게임에서 토큰의 이동처럼 리스크가 거의 없을 때에만 가능합니다. 

NoSQL 솔루션은 한 문서 내에서 원자성(Atomicity)을 보장할 수 있지만, 엔터프라이즈 시스템에는 적합하지않습니다. 즉, 정형/비정형에 상관없이 통합되지 않은 데이터 간의 미션 크리티컬 시스템에 부적합합니다. Postgres의 NoSQL 기능을 사용하면 기존 데이터와 비정형 데이터의 손쉬운 통합, NoSQL 툴에서 누릴 수 있는 성능, 민첩성, 비정형 지원을 유지 할 수 있습니다.

 

단순성

소셜 또는 모바일 웹 관련 Writing 앱은 Postgres의 Javascript, Python, Ruby, node.js, JSON, Key-Values, geo-spatial 및 XML 지원을 포함한 스냅입니다.

개발자들은 자신이 자주 사용하는 agile tool을 사용하여 고객 경험 개선, 빠른 제품출시, 비용 절감을 할 수 있습니다.

 

확장성

수천 명의 사용자들이 대용량 데이터를 사용할 수 있는 처리시스템이 부각 되면서 Postgres 사용자가 급증하게 되었습니다. 데이터 양에 상관없이, Postgres는 다수의 동시 사용자들을 위해 엄청난 양의 데이터를 손쉽게 처리합니다. 

  • EDB의 xDB Replication Server는 non-virtualized read scale out 솔루션을 제공합니다. 멀티 마스터 설정으로 되어 있는 xDB는 미국의 최대 전화업체 한 곳에 read scalability와 write availability를 제공하고 있습니다. 
  • EDB Failover Manager는 내결함성 데이터베이스 클러스터 생성을 통해 마스터 데이터베이스에 장애가 발생 시 고가용성 9s 구성에서 데이터가 온라인으로 유지되도록 하여 다운타임을 최소화할 수 있습니다. 
  • 성능 대시보드, 크리티컬 상태 알람, 용량 계획 수립, 로그 분석기 등을 완벽하게 갖춘 EDB Postgres Enterprise Manager를 이용하면 대규모 Postgres 설정 및 솔루션을 전문적으로 관리, 모니터링 및 튜닝할 수 있습니다.

 

성능

현재까지 Postgres는 최대 규모의 보험회사, 은행, 중개업체, 정부 기관, 방위 업체 등의 까다로운 요구사항에 부합하는 솔루션입니다.  매년 출시되는 Postgres는 성능 개선 및 비정형 데이터 처리 성능까지 갖추었습니다.

 

EDB encourages you to experience Postgres' NoSQL performance for yourself. Download the pg_nosql_benchmark  at GitHub let us know what you think.

문서/관계형 데이터베이스 비교

신기술을 현명하게 선택하려면 자신의 요건을 꼼꼼히 평가하고 그 요건에 가장 부합하는 툴을 선택해야 합니다. 아래 표는 NoSQL 문서 지향 데이터베이스(예: MongoDB)와 Postgres의 관계형/문서 데이터베이스의 특징을 비교한 결과로, 각자 자신의 요건에 딱 맞는 솔루션을 찾는 데 유용할 것입니다.

특징 MongoDB PostgreSQL
오픈 소스 개발 시작 2009 1995
스키마 동적 정적 및 동적
계층형 문서 데이터 지원 지원 지원(2012년부터)
키 값 데이터 지원 지원 지원(2006년부터)
관계형 데이터/표준 형식 저장 지원 미지원 지원
데이터 제약 조건 미지원 지원
Maximum Document Size 16 MB 1,000 MB
Joining of Data Extremely Difficult Extremely Easy
Powerful Standardized Query Language 미지원 지원
트랜잭션 지원 및 다중 버전 동시 제어 미지원 지원
원자성 트랜잭션 한 문서 내 데이터베이스 전체에 걸쳐
지원되는 웹 개발 언어 JavaScript, Python, Ruby 등… JavaScript, Python, Ruby 등…
공통 웹 데이터 형식 지원 JSON (문서), Key-Value, XML JSON (문서), Key-Value, XML
지형공간 지원 지원 지원
가장 쉬운 확장 방법 수평적 스케일 아웃 수직적 스케일업
분할 용이 복잡
서버측 프로그래밍 없음 Python, JavaScript, C,C++, Tcl, Perl 등 다양한 절차 언어
다른 데이터 스토어와 손쉽게 통합 No, creates data silos Yes, Foreign Data Wrappers to Oracle, MySQL, MongoDB, CouchDB, Redis, Neo4j, Twitter, LDAP, File, Hadoop and more…
비즈니스 로직 Embedded in and Distributed Across Client Applications 트리거 및 저장 프로시저를 통한 중앙집중화 또는 클라이언트 어플리케이션 전체에 걸쳐 분산화
역량이 있는 자원의 가용성 찾기 어려움 찾기 용이
주 용도 데이터 무결성과 일관성이 필요하지 않은 경우에 동시 업데이트 빈도가 높은 빅데이터(수십억 개 기록). 표준 형식, 조인, 데이터 제약 조건, 트랜잭션 지원 등을 이용할 수 있는 트랜잭션 및 운영 어플리케이션

 

Postgres의 JSON 기능에 대한 자세한 설명은...

Postgres는 정형 데이터와 비정형 데이터를 모두 지원합니다.

문서 저장, 키 값 저장 등의 NoSQL 기술은 ER 다이아그래밍, 표준 형식 분석, 컨셉/논리/물리적 설계 프레임워크를 이용해 미리 조심스럽게 만드는 것이 아니라 어플리케이션이 민첩한 개발 주기를 거치면서 데이터 모델이 형성되는 증분적 개발 방법론을 지원합니다.

NoSQL과 ACID를 모두 지원

Postgres는 JSON(2012)과 HSTORE(2006)를 출시해 솔루션 아키텍트 및 개발자들에게 스키마 없는 데이터 관리 옵션을 제공하는데, 이는 Postgres의 견고한 ACID(Atomic, Consistent, Isolation and Durable) 모델에 완벽하게 통합됩니다.

 

JSON 데이터 형식 지원

Postgres는 유효성 검증 파서, 스토리지, JSON 문서 내에서 필요한 요소들을 추출하기 위한 각종 기능을 모두 갖추어 JSON 데이터를 삽입하는 데 필요한 지원을 제공합니다.

 

JSON In 및 JSON Out

Postgres는 쿼리 결과 세트를 JSON으로 손쉽게 인코딩할 수 있는 기능도 제공하기 때문에 JSON을 그대로 이용하는 것을 선호하는 어플리케이션 개발자들이 Postgres에서 필요한 데이터를 원래 형식 그대로 손쉽게 얻을 수 있습니다.

 

문서 및 키 값 데이터

Postgres는 2006년부터 키 값 지원을 위한 HSTORE도 제공했지만 다른 NoSQL 전용 솔루션과는 달리 Postgres에서 만들어지는 키 값 스토어는 ACID에 부합합니다. JSON처럼, HSTORE도 스키마 없는 데이터베이스를 에뮬레이션하는 데 사용할 수 있습니다(바람직한 경우). 또, Postgres에 의해 유지관리되는 키 값 데이터를 JSON 형식의 데이터로 변환할 수 있는 기능도 있어서 Postgres가 처리할 수 있는 NoSQL 같은 어플리케이션의 유연성과 범위가 커집니다.

 

JSON 및 Javascript

Postgres는 데이터베이스 자체에 Javascript 기능을 제공하기 때문에 웹 개발자들이 웹 클라이언트의 기반이 되는 JavaScript 엔진을 그대로 사용해 중앙집중식 데이터베이스 로직을 작성할 수 있습니다. Chrome을 위해 Google에서 개발한 V8은 클라이언트와 서버에서 모두 작동하도록 설계되었고 Node.js의 중심에서도 작동합니다. V8은 Postgres 애드온 PL/V8로 이용할 수 있습니다.  Postgres를 통해서 개발자들이 데이터베이스에서도 자신의 웹 데이터 형식과 웹 어플리케이션 언어를 그대로 사용해 작업할 수 있습니다.

 

정밀성이 중요한 경우를 고려한 Postgres

Postgres 9.4에 추가된 JSONB는 BSON과 전혀 다른 바이너리 스토리지 형식에 기반한 두 번째 JSON 유형으로, 대형 문서 전용 데이터베이스 제공업체 중 한 곳에서 사용하고 있습니다. BSON은 'Binary JSON'을 의미하지만, 사실 모든 JSON 값을 BSON으로 나타낼 수 있는 것은 아닙니다. 예를 들면, BSON은 정수 또는 부동 소수점수를 64비트 정밀도보다 높은 정밀도로 나타낼 수 없는 반면, JSONB는 임의의 JSON 값을 모두 나타낼 수 있습니다.

Postgres의 JSON 기능에 대한 자세한 설명은...

Postgres JSON/JSONB 연산자와 함수

아래 표에는 Postgres 관계형 환경에서 JSON 데이터를 저장, 검색, 변환, 조작, 생성할 때 사용할 수 있는 다양한 연산자와 함수가 정리되어 있습니다. Postgres의 키 값 형식(HSTORE), 전체 텍스트 검색, 트라이그램 검색, 최단거리 인접 검색, GIN 및 GiST 인덱싱, 언로그드 테이블, XML 지원, FDW에서 이러한 기능을 이용하는 경우(예: MongoDB, CouchDB 및 Redis) 그리고 '결과적 일관성'을 위해 비동기식 커밋이 설정되어 있다면, 비정형 데이터 요건을 충족하기 위해 별도의 전용 데이터베이스가 필요하지 않다는 것을 알게 될 것입니다.

Postgres의 JSON 데이터 형식은 RFC 7159에 명시된 대로 JSON(JavaScript Object Notation) 데이터를 저장하기 위한 것입니다. JSON 데이터 형식은 입력 텍스트와 똑같은 복사본을 저장하므로 처리 함수가 매번 실행 시 내용을 재분석해야 합니다. 반면, JSONB 데이터는 분해된 바이너리 형식으로 저장되므로 변환 오버헤드가 추가되어 입력 시간이 약간 느리고 재분석이 필요하지 않아 처리 속도는 훨씬 높습니다. JSONB는 인덱싱도 지원하는데, 이것은 상당히 큰 장점 중 하나입니다.

 

아래 표에는 두 가지 JSON 데이터 형식인 JSON과 JSONB에서 사용할 수 있는 연산자가 정리되어 있습니다.

JSON 및 JSONB 연산자
연산자 오른쪽 피연산자 형식 설명
–> int Get JSON array element (indexed from zero,negative integers count from the end)
–> 텍스트 JSON 오브젝트 필드를 키로 받기
–>> int JSON 어레이 요소를 텍스트로 받기
–>> 텍스트 JSON 오브젝트 필드를 텍스트로 받기
#> 텍스트[ ] JSON 오브젝트를 지정 경로에서 받기
#> 텍스트[ ] JSON 오브젝트를 지정 경로에서 텍스트로 받기

 

JSON의 바이너리 스토리지 형식인 JSONB의 경우에만 추가 연산자가 존재합니다.

JSONB의 추가 연산자
연산자 오른쪽 피연산자 형식 설명
@> jsonb Does the left JSON value contain the right JSON path/value entries at the top level?
<@ jsonb Are the left JSON path/value entries contained at the top level within the right JSON value?
? 텍스트 Does the string exist as a top-level key within the JSON value?
?| 텍스트[ ] Do any of these array strings exist as top-level keys?
?& 텍스트[ ] Do all of these array strings exist as top-level keys?
| | jsonb Concatenate two jsonb values into a new jsonb value.
- 텍스트 Delete key/value pair or string element from left operand. Key/value pairs are matched based on their key value.
- integer Delete the array element with specified index (Negative integers count from the end). Throws an error if top level container is not an array.
#- text[] Delete the field or element with specified path (for JSON arrays, negative integers count from the end).

 

이 표에는 JSON 값을 생성하는 데 이용할 수 있는 함수가 정리되어 있습니다. 현재 JSONB의 경우에는 이에 해당하는 함수가 없지만 이런 함수 중 하나의 결과를 JSON으로 보낼 수는 있습니다.

JSON 생성 함수
함수 설명
to_json(anyelement)

to_jsonb(anyelement)

Returns the value as json or jsonb. Arrays and composites are converted (recursively) to arrays and objects; otherwise, if there is a cast from the type to json, the cast function will be used to perform the conversion; otherwise, a scalar value is produced. For any scalar type other than a number, a Boolean, or a null value, the text representation will be used, in such a fashion that it is a valid json or jsonb value.
array_to_json(anyarray [, pretty_bool]) 어레이를 JSON 어레이로 반환합니다. PostgreSQL 다차원 어레이는 JSON 어레이가 됩니다. pretty_bool이 참이면 dimension-1 요소들 사이에 라인 피드가 추가됩니다.
row_to_json(record [, pretty_bool]) 행을 JSON 오브젝트로 반환합니다. pretty_bool이 참이면 level-1 요소들 사이에 라인 피드가 추가됩니다.
json_build_array(VARIADIC "any")

jsonb_build_array(VARIADIC "any")

가변인자 인수 목록에서 주로 이기종 형식의 JSON 어레이를 구성합니다.
json_build_object(VARIADIC "any")

jsonb_build_object(VARIADIC "any")

Builds a JSON object out of a variadic argument list. By convention, the argument list consists of alternating keys and values.
json_object(text[ ])

jsonb_object(text[ ])

Builds a JSON object out of a text array. The array must have either exactly one dimension with an even number of members, in which case they are taken as alternating key/value pairs, or two dimensions such that each inner array has exactly two elements, which are taken as a key/value pair.
json_object(keys text[ ], values text[ ])

jsonb_object(keys text[ ], values text[ ])

이 json_object 형식은 개별 어레이 2개로부터 키와 값을 쌍으로 취합니다. 다른 모든 측면에서는 단일 인수 형식과 동일합니다.

 

마지막 표에는 JSON 및 JSONB 값을 처리하는 데 이용할 수 있는 함수가 정리되어 있습니다.

JSON 처리 함수
함수 반환 형식 설명
json_array_length(json)

jsonb_array_length(jsonb)

int 가장 바깥쪽 JSON 어레이의 요소 개수를 반환합니다.
json_each(json)

jsonb_each(jsonb)

setof key text, value json

setof key text, value jsonb

가장 바깥쪽 JSON 오브젝트를 키/값 쌍 세트로 확장합니다.
json_each_text(json)

jsonb_each_text(jsonb)

setof key text,

value text

가장 바깥쪽 JSON 오브젝트를 키/값 쌍 세트로 확장합니다. 반환되는 값은 텍스트 유형입니다.
json_extract_path(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path(from_jsonb jsonb, VARIADIC path_elems text[ ])

json

jsonb

Returns JSON value pointed to by path_elems (equivalent to #> operator).
json_extract_path_text(from_json json, VARIADIC path_elems text[ ])

jsonb_extract_path_text(from_json jsonb, VARIADIC path_elems text[ ])

test Returns JSON value pointed to by path_elems as text (equivalent to #>> operator).
json_object_keys(json)

jsonb_object_keys(jsonb)

setof text 가장 바깥쪽 JSON 오브젝트의 키 세트를 반환합니다.
json_populate_record(base anyelement, from_json json)

jsonb_populate_record(base anyelement, from_json jsonb)

anyelement 기본적으로 정의된 기록 유형과 열이 일치하는 행으로 from_json의 오브젝트를 확장합니다(아래 참고 사항 참고).
json_populate_recordset(base anyelement, from_json json)

jsonb_populate_recordset(base anyelement, from_json jsonb)

setof anyelement from_json의 가장 바깥쪽 오브젝트 어레이를 기본적으로 정의된 기록 유형과 열이 일치하는 행 세트로 확장합니다(아래 참고 사항 참고).
json_array_elements(json)

jsonb_array_elements(jsonb)

setof json

setof jsonb

JSON 어레이를 JSON 값 세트로 확장합니다.
json_array_elements_text(json)

jsonb_array_elements_text(jsonb)

setof text JSON 어레이를 텍스트 값 세트로 확장합니다.
json_typeof(json)

jsonb_typeof(jsonb)

텍스트 가장 바깥쪽 JSON 값의 유형을 텍스트 문자열로 반환합니다. 가능한 값은 오브젝트, 어레이, 문자열, 수, 부울, null입니다.
json_to_record(json)

jsonb_to_record(jsonb)

record Builds an arbitrary record from a JSON object (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.
json_to_recordset(json)

jsonb_to_recordset(jsonb)

setof record Builds an arbitrary set of records from a JSON array of objects (see note below). As with all functions returning record, the caller must explicitly define the structure of the record with an AS clause.
json_strip_nulls(from_json json)

jsonb_strip_nulls(from_json jsonb)

json

jsonb

Returns from_json with all object fields that have null values omitted. Other null values are untouched.
jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean]) jsonb Returns target with the section designated by path replaced by new_value, or with new_value added if create_missing is true ( default is true) and the item designated by path does not exist. As with the path orientated operators, negative integers that appear in path count from the end of JSON arrays.
jsonb_pretty(from_json jsonb) 텍스트 Returns from_json as indented JSON text.

 

예 및 예제 결과를 포함한 JSON 함수 및 연산자 참조를 보려면 여기를 클릭하십시오.

 

Postgres의 JSON 기능에 대한 자세한 설명은...

Tell Us What You Think!

We want to improve this website, and we need your help! Please tell us how well this website meets your needs:

Begin Survey >>

PG XDK 튜토리얼

PostgreSQL XDK에서는 PostgreSQL의 NoSQL 기능을 살펴볼 수 있습니다. 

Amazon Web Services에 관한
무료 튜토리얼을 통해 PostgreSQL 9.4의 JSON 데이터 조작 방법을 배워보십시오.

PG XDK 빠른 시작 가이드

PostgreSQL 다운로드

 

NoSQL Webcast

Greater Developer Flexibility with NoSQL in EDB Postgres

NoSQL will give developers control over the data to be stored within the database without having to rely on a DBA to implement changes. This presentation will give an overview of what NoSQL is, briefly what the pros and cons are, and includes a demo of the NoSQL functionality in EDB Postgres to allow you to better choose the best data management solution for your use case.
 

NoSQL 벤치마크

MongoDB와 비교해 Postgres가 비정형 데이터를 얼마나 더 효과적으로 처리하는지 직접 확인해보십시오.

Postgres NoSQL 벤치마크를 다운로드해 직접 테스트를 진행해보십시오!

PostgreSQL 다운로드