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

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

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



답변

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

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

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

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

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


답변

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

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

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

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

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


답변

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

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

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

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

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

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


답변

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

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

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

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

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


답변

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

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

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


답변

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

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

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

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

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


답변

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

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