관계형 데이터베이스와 그래프 데이터베이스의 비교


91

누군가가 Neo4j와 같은 그래프 데이터베이스에 비해 MySQL과 같은 관계 데이터베이스의 장점과 단점을 설명해 줄 수 있습니까?

SQL에는 다양한 ID가 연결되어있는 여러 테이블이 있습니다. 그런 다음 테이블을 연결하기 위해 조인해야합니다. 초보자의 관점에서 왜 그래프 데이터베이스 에서처럼 처음부터 가장자리로 연결을 명시 적으로 지정하는 대신 조인을 요구하도록 데이터베이스를 설계해야합니다. 개념적으로는 초보자에게는 의미가 없습니다. 아마도 이것에 대한 매우 기술적이지만 개념적이지 않은 이유가 있습니까?


액세스 방법이 다릅니다. 관계형 데이터베이스에서는 재귀로 가장 잘 보강 된 Relational Algebra 를 사용합니다 . 이는 어색하지만 인기있는 표현 인 (재귀 적, 절차 적 추가 포함) SQL입니다. 그래프 데이터베이스에서는 Gremlin 과 같은 그래프 순회 언어를 사용합니다 . 온 디스크 레이아웃까지의 기본 DB 구현은 각 액세스 방법에 대해 최상의 성능을 제공하도록 선택되며 구현에서 임의의 조정 / 변형을 찾을 수 있습니다.
David Tonhofer 2017-06-06

답변:


118

실제로 두 스타일 뒤에는 개념적 추론이 있습니다. 관계형 모델그래프 데이터베이스대한 Wikipedia는 이에 대한 좋은 개요를 제공합니다.

주요 차이점은 그래프 데이터베이스에서는 관계가 개별 레코드 수준에 저장되는 반면 관계형 데이터베이스에서는 구조가 더 높은 수준 (테이블 정의)에서 정의된다는 것입니다.

이것은 중요한 결과를 가져옵니다.

  • 관계형 데이터베이스는 엄청난 수의 레코드에서 작동 할 때 훨씬 빠릅니다. 그래프 데이터베이스에서는 데이터 구조를 결정하기 위해 쿼리 중에 각 레코드를 개별적으로 검사해야하지만 관계형 데이터베이스에서는 미리 알려집니다.
  • 관계형 데이터베이스는 모든 관계를 저장할 필요가 없기 때문에 저장 공간을 덜 사용합니다.

모든 관계를 개별 레코드 수준에 저장하는 것은 관계에 많은 변화가있을 경우에만 의미가 있습니다. 그렇지 않으면 똑같은 것을 계속해서 복제하는 것입니다. 즉, 그래프 데이터베이스는 불규칙하고 복잡한 구조에 적합합니다. 그러나 실제 세계에서 대부분의 데이터베이스에는 비교적 단순한 규칙적인 구조가 필요합니다. 이것이 관계형 데이터베이스가 우세한 이유입니다.


17
레코드 수준에서 관계를 저장하는 것은 인덱스가없는 인접성을 제공하므로 다른 경우에도 의미가 있습니다. 즉, 인덱스 조회없이 그래프 순회를 수행 할 수있어 성능이 훨씬 향상됩니다. 그리고 실제 관계를 저장하므로 복제가 아닙니다.
nawroth 2013

4
"그래프 데이터베이스에서는 데이터 구조를 결정하기 위해 쿼리 중에 각 레코드를 개별적으로 검사해야합니다."라고 말합니다. 이것은 그래프 데이터베이스의 보편적 인 속성입니까, 아니면 일반적으로 어느 정도 사실입니까? 꼭지점과 가장자리에 대한 전체 스키마를 지원하는 OrientDb는 어떻습니까?
Lodewijk Bogaards 2014 년

@LodewijkBogaards Neo4j와 같은 일부 그래프 데이터베이스는 기본 인덱싱을 허용합니다. 쿼리가 인덱스에 도달하면 인덱스 뒤에있는 데이터의 구조를 결정할 필요가 없다고 생각합니다. 그러나 그것은 쿼리에 따라 다릅니다.
Vojtěch Vít

3
나는 두 가지 요점에 강하게 동의하지 않습니다. 그래프 데이터베이스는 외래 키가있을 때 항상 더 빠릅니다. 조인 작업이 필요하지 않기 때문입니다. 관계형 데이터베이스는 많은 테이블에 외래 키를 저장해야합니다. 에지와 외래 키는 동일한 저장 공간을 가져야합니다.
cegprakash

3
@cegprakash 우리도 같은 결론을 내릴 수있는 문서가 있습니까?
Victor

101

그래프와 관계형 데이터베이스의 주요 차이점은 관계형 데이터베이스는 세트로 작동하는 반면 그래프 데이터베이스는 경로로 작동한다는 것입니다.

이것은 RDBMS 사용자에게 예기치 않은 도움이되지 않는 방식으로 나타납니다. 예를 들어, 관계형 데이터베이스에 재귀 적으로 참여하여 경로 작업 (예 : 친구의 친구)을 에뮬레이션하려고 할 때 쿼리 대기 시간이 메모리 사용량만큼 예측할 수 없을 정도로 크게 증가합니다. 이러한 작업을 표현하기 위해 SQL을 고문하는 것은 말할 것도 없습니다. 데이터가 많을수록 집합 기반 데이터베이스에서 속도가 느려진다는 것은 신중한 인덱싱을 통해 고통을 늦출 수 있다는 것을 의미합니다.

Dan1111이 암시했듯이 대부분의 그래프 데이터베이스는 근본적인 수준에서 관계를 표현하기 때문에 이러한 종류의 조인 문제를 겪지 않습니다. 즉, 관계는 물리적으로 디스크에 존재하며 이름이 지정되고 지정되며 속성으로 자체적으로 장식 될 수 있습니다 (이를 속성 그래프 모델이라고합니다. https://github.com/tinkerpop/blueprints/wiki/Property-Graph 참조). -모델 ). 즉, 선택한 경우 디스크의 관계를보고 엔터티를 "조인"하는 방법을 볼 수 있습니다. 따라서 관계는 그래프 데이터베이스에서 일류 엔터티이며 관계형 저장소에서 런타임에 수정 된 암시 적 관계보다 의미 상 훨씬 강력합니다.

그렇다면 왜 관심을 가져야합니까? 두 가지 이유가 있습니다.

  1. 그래프 데이터베이스는 연결된 데이터에 대한 관계형 데이터베이스보다 훨씬 빠르며 기본 모델의 강점입니다. 그 결과 그래프 데이터베이스의 쿼리 지연 시간은 쿼리에서 탐색하기 위해 선택한 그래프의 양에 비례하고 저장된 데이터 양에 비례하지 않으므로 조인 폭탄 을 해소합니다. .
  2. 그래프 데이터베이스를 사용하면 모델링과 쿼리가 훨씬 더 즐거워 져 개발 속도가 빨라지고 WTF 순간이 줄어 듭니다. 예를 들어, Neo4j의 Cypher 쿼리 언어로 전형적인 소셜 네트워크에 대한 친구의 친구를 표현하는 것은 MATCH (me)-[:FRIEND]->()-[:FRIEND]->(foaf) RETURN foaf.

3
따라서 관계는 그래프 데이터베이스에서 일류 엔티티입니다. 일반적으로 관계형 데이터베이스에서도 마찬가지입니다. 엔터티는 다 대다 관계와 마찬가지로 관계에서 튜플에 매핑됩니다. 종종 엔터티 관계로 병합되는 일대 다 관계에 대해 설명하는 구분이 있습니까?
beldaz

53
이 비교는 약간 편향된 것 같습니다. 단점은 어떻습니까?
Kurren

10
조금? 내 솔직한 의견에 너무 편향되어 있습니다. "이것은 좋은 제품입니다!이 제품을 구입하십시오"라는 광고처럼 보입니다.
ilgaar dec

38
이것은 엄청난 경고 가 필요합니다 .이 사람은 Neo4J 그래프 데이터베이스를 만드는 Neo Technology의 "최고 과학자"입니다.
롭 그랜트

5
임의 검색은 어떻습니까? 35 세에서 55 세 사이의 모든 사용자를 제공하고 지난 90 일 동안 월마트에서 쇼핑하십시오.
Matthew Whited

20

Dan1111은 이미 올바른 것으로 표시된 답변을 제공했습니다. 몇 가지 추가 포인트는 통과시 주목할 가치가 있습니다.

첫째, 거의 모든 그래프 데이터베이스 구현에서 레코드는 현재 위치의 레코드를 가리키는 알 수없는 수의 포인터가 있기 때문에 "고정"됩니다. 즉, 이전 위치에 전달 주소를 남기거나 알 수없는 포인터 수를 끊지 않고 레코드를 새 위치로 섞을 수 없습니다.

이론적으로는 모든 레코드를 한 번에 섞어서 모든 포인터를 찾고 복구하는 방법을 알아낼 수 있습니다. 실제로 이것은 큰 그래프 데이터베이스에서 몇 주가 걸릴 수있는 작업이며,이 시간 동안 데이터베이스는 무선 상태가되어야합니다. 그것은 실현 가능하지 않습니다.

대조적으로, 관계형 데이터베이스에서 레코드는 상당히 큰 규모로 재편성 될 수 있으며 수행해야하는 유일한 작업은 영향을받은 인덱스를 다시 작성하는 것입니다. 이것은 상당히 큰 작업이지만 그래프 데이터베이스에 해당하는 작업만큼 크지는 않습니다.

두 번째 포인트는 월드 와이드 웹이 거대한 그래프 데이터베이스로 보일 수 있다는 것입니다. 웹 페이지에는 다른 웹 페이지와 같은 하이퍼 링크 및 하이퍼 링크 참조가 포함됩니다. 참조는 포인터처럼 작동하는 URL을 통해 이루어집니다.

이전 URL에 전달 주소를 남기지 않고 웹 페이지를 다른 URL로 이동하면 알 수없는 수의 하이퍼 링크가 끊어집니다. 이러한 끊어진 링크는 많은 서퍼들의 즐거움을 방해하는 두려운 "오류 404 : 페이지를 찾을 수 없음"메시지를 발생시킵니다.


4
대부분의 그래프 데이터베이스에는 끊어진 링크를 허용하지 않는 무결성 규칙이 있습니다.
Michael Hunger

1
DBMS가 대상을 고정하면 링크 대상 이동으로 인한 링크 끊김을 분명히 방지 할 수 있습니다. 링크의 대상이 될 수있는 레코드를 고정하지 않는 그래프 데이터베이스를 모릅니다.
Walter Mitty 2013

모든 포인터를 다시 작성해야하기 때문에 스키마 변경이 매우 무거운 작업이므로 그래프 데이터베이스는 일반적으로 스키마가 없습니까? 룩업 테이블을 통과하는 가상 포인터를 저장하는 것만으로 재편성 문제를 피할 수 없습니까? 이것은 여전히 ​​O (1)에서 수행 될 것입니까?
Lodewijk Bogaards 2014 년

저는 계층 적 또는 네트워크 데이터베이스와 같은 사전 관계형 데이터베이스를 포함하는 그래프 데이터베이스의 정의에 따라 운영해 왔습니다. 이러한 데이터베이스 중 일부에는 관계형 스키마는 아니지만 스키마가 있습니다. 내 운영 정의가 표준 정의와 일치하는지 여부가 확실하지 않습니다.
Walter Mitty 2014 년

가상 포인터와 물리적 포인터 간의 매핑을 제공하는 데이터 구조는 기본적으로 인덱스와 동일하며 비용은 거의 동일합니다. 계속해서 관계형 데이터베이스를 사용할 수도 있습니다.
Walter Mitty 2014 년

7

관계형 데이터베이스를 사용하면 외래 키와 자체 조인을 사용하여 그래프를 모델링하고 쿼리 할 수 ​​있습니다. RDBMS에 관계형이라는 단어가 포함되어 있다고해서 관계를 잘 처리한다는 의미는 아닙니다. RDBMS에서 관계형이라는 단어는 관계가 아닌 관계형 대수에서 유래합니다. RDBMS에서 관계 자체는 자체적으로 객체로 존재하지 않습니다. 외래 키로 명시 적으로 표현하거나 링크 테이블의 값으로 암시 적으로 표현해야합니다 (일반 / 범용 모델링 접근 방식을 사용할 때). 데이터 세트 간의 링크는 데이터 자체에 저장됩니다.

관계형 데이터베이스에서 검색 깊이가 증가할수록 수행해야하는 자체 조인이 많고 쿼리 성능이 더 저하됩니다. 계층 구조가 깊어 질수록 조인해야하는 테이블이 많고 쿼리 속도가 느려집니다. 수학적으로 비용은 관계형 데이터베이스에서 기하 급수적으로 증가합니다. 즉, 쿼리와 관계가 복잡할수록 관계형 데이터베이스에 비해 그래프에서 더 많은 이점을 얻을 수 있습니다. 그래프를 탐색 할 때 그래프 데이터베이스에 성능 문제가 없습니다. 이는 그래프 데이터베이스가 관계를 별도의 개체로 저장하기 때문입니다. 그러나 우수한 읽기 성능은 쓰기 속도가 느려집니다.

특정 상황에서는 RDBMS에서보다 그래프 데이터베이스에서 데이터 모델을 변경하는 것이 더 쉽습니다. 예를 들어 테이블 관계를 1 : n에서 m : n으로 변경하는 경우 RDBMS에서 잠재적 인 다운 타임과 함께 DDL을 적용해야합니다.

반면에 RDBMS는 데이터 집계 또는 데이터에 대한 타임 스탬프 버전 제어와 같은 다른 영역에서 이점이 있습니다.

데이터웨어 하우징을위한 그래프 데이터베이스에 대한 블로그 게시물에서 다른 장단점에 대해 논의합니다.


"RDBMS에서 관계형이라는 단어는 관계형 대수에서 유래했습니다."-일종의. "관계에서가 아닙니다."-FK의 의미에서 관계가 아니라 관계 / 연관을 나타내는 테이블의 의미에서 관계에서 관계형 대수 및 RDBMS에서 관계가 나온다는 점에서 관계입니다. FK는 관계형 모델을 오해하는 방법으로 관계라고 잘못 불립니다. FK는 기록 또는 쿼리를 위해 알려 지거나 존재할 필요가 없습니다. 그들은 무결성을위한 것입니다. 쿼리에 필요하고 충분한 것은 (기본 또는 쿼리 결과) 테이블이 나타내는 관계 / 연관을 아는 것입니다.
philipxy

4

관계형 모델은 그래프 모델에 포함 된 데이터를 쉽게 나타낼 수 있지만 실제로는 두 가지 중요한 문제에 직면합니다.

  1. SQL에는 그래프 순회, 특히 깊이를 알 수 없거나 제한되지 않은 순회를 쉽게 수행 할 수있는 구문이 없습니다. 예를 들어, SQL을 사용하여 친구의 친구를 결정하는 것은 쉽지만 "분리 정도"문제를 해결하기는 어렵습니다.
  2. 그래프를 탐색하면 성능이 빠르게 저하됩니다. 각 순회 수준은 쿼리 응답 시간을 크게 증가시킵니다.

참조 : 차세대 데이터베이스


0

그래프 데이터베이스는 뛰어난 사용 사례에 대해 조사 할 가치가 있지만 위의 답변에서 몇 가지 주장에 의문을 제기 할 이유가 있습니다. 특히:

관계형 데이터베이스는 엄청난 수의 레코드에서 작업 할 때 훨씬 더 빠릅니다 (dan1111의 첫 번째 글 머리 기호).

그래프 데이터베이스는 연결된 데이터에 대한 관계형 데이터베이스보다 훨씬 빠르며 기본 모델의 강점입니다. 그 결과 그래프 데이터베이스의 쿼리 지연 시간은 쿼리에서 탐색하기 위해 선택한 그래프의 양에 비례하고 저장된 데이터 양에 비례하지 않으므로 조인 폭탄을 해소합니다. (짐 웨버의 첫 번째 글 머리 기호)

즉, 쿼리와 관계가 복잡할수록 관계형 데이터베이스에 비해 그래프에서 더 많은 이점을 얻을 수 있습니다. (Uli Bethke의 두 번째 단락)

이러한 주장에는 장점이있을 수 있지만, 특정 사용 사례가 이에 부합하도록하는 방법을 아직 찾지 못했습니다. 참조 : 그래프 데이터베이스 또는 관계형 데이터베이스 공통 테이블 확장 : 비순환 그래프 쿼리 성능 비교


0

관계형 데이터베이스는 테이블 형식 데이터를 저장하는 데 훨씬 더 효율적입니다. 이름에 "관계형"이라는 단어가 있음에도 불구하고 관계형 데이터베이스는 저장된 데이터 요소 간의 관계를 저장하거나 표현하는 데 훨씬 덜 효과적입니다. 관계형 데이터베이스에서 '관계형'이라는 용어는 다른 테이블의 정보를 관련시키는 것이 아니라 테이블 내의 관련 열과 더 관련이 있습니다. 집합 연산을 지원하기 위해 열 간의 관계가 존재합니다. 따라서 데이터베이스가 수백만 또는 수십억 개의 레코드로 증가함에 따라 관계형 데이터베이스에서 데이터를 검색하는 것이 매우 느려집니다.

관계형 데이터베이스와 달리 그래프 데이터베이스는 전적으로 데이터 관계를 중심으로 구성됩니다. 그래프 데이터베이스는 관계를 스키마 구조가 아니라 다른 값처럼 데이터로 취급합니다. 그래프 데이터베이스에서 데이터를 검색하는 것은 매우 빠릅니다. 관계형 데이터베이스 관점에서 볼 때 모든 쿼리에 대해 계산하는 대신 삽입 시간에 한 번 JOIN을 사전 구체화하는 것으로 생각할 수 있습니다. 데이터는 전적으로 데이터 관계를 중심으로 구조화되기 때문에 데이터 세트가 얼마나 크거나 연결되어 있더라도 실시간 쿼리 성능을 얻을 수 있습니다. 그래프 데이터베이스는 관계형 데이터베이스에 비해 더 많은 저장 공간을 차지합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.