MySQL과 Neo4j를 함께 사용하는 것이 좋을까요?
비슷한 아이템(밀리언)이 많은 어플리케이션을 만들어 MySQL 데이터베이스에 저장하고 싶습니다.왜냐하면 많은 통계와 특정 컬럼의 특정 값을 검색하고 싶기 때문입니다.
그러나 동시에 연결된 바이너리 트리 형태의 구조(트랜시티브 클로징)에 관련된 모든 항목 간의 관계와 관계 데이터베이스는 그러한 구조가 좋지 않기 때문에 이러한 데이터에 대해 성능이 좋은 모든 관계를 Neo4j에 저장하고 싶습니다.
내 계획은 MySQL 데이터베이스의 관계와 모든 관계를 제외한 모든 데이터를 보유하는 것이다.item_id
Neo4j 데이터베이스에 저장됩니다.트리를 조회할 때 먼저 Neo4j에서 검색하여item_id
:s를 트리에서 검색한 후 MySQL 데이터베이스에서 다음과 같은 쿼리의 모든 항목을 검색합니다.
SELECT * FROM items WHERE item_id = 45 OR item_id = 345435 OR item_id = 343 OR item_id = 78 OR item_id = 4522 OR item_id = 676 OR item_id = 443 OR item_id = 4255 OR item_id = 4345
이게 좋은 생각일까요, 아니면 제가 크게 틀렸나요?나는 지금까지 그래프 데이터베이스를 사용해 본 적이 없다.제 문제에 대한 더 나은 접근법이 있을까요?이 경우 MySQL 쿼리는 어떻게 작동합니까?
이에 대한 생각은 거의 없습니다.
그래프에 각 노드의 속성을 포함하도록 Neo4j 도메인 모델을 모델링해 보겠습니다.데이터를 두 개의 다른 데이터스토어로 분리하면 수행할 수 있는 일부 작업을 제한할 수 있습니다.
그래프로 뭘 할 지로 귀결되는 것 같아요.예를 들어 속성(이름, 경과시간)을 가진 특정 노드에 연결된 모든 노드를 찾는 경우.특정 값입니다. 먼저 MySQL 데이터베이스에서 올바른 노드 ID를 찾은 후 Neo4j로 이동해야 합니까?Neo4j에서 이 모든 것을 할 수 있을 때, 이것은 느리고 너무 복잡해 보입니다.따라서 그래프를 이동할 때 노드의 속성이 필요합니까?
데이터가 변경됩니까, 아니면 정적인가요?두 개의 개별 데이터 저장소를 보유하면 문제가 복잡해집니다.
MySQL 데이터베이스를 사용하여 통계를 생성하는 것이 Neo4j의 모든 작업보다 쉬울 수 있지만 정의된 기준을 충족하는 모든 노드를 찾기 위해 그래프를 이동하는 데 필요한 코드는 그리 어렵지 않습니다.이러한 통계 정보가 솔루션을 주도할 것입니다.
노드 ID를 선택하기 위한 MySQL 쿼리의 성능에 대해 코멘트할 수 없습니다.이는 선택해야 할 노드의 수와 인덱싱 전략에 따라 달라집니다.하지만 그래프를 가로지를 때 성능 측면에서는 동의합니다.
이 기사는 다음과 같은 내용을 담고 있는 좋은 기사입니다.MySQL과 대규모 그래프 트래버설의 Neo4j. 이 경우 large라고 하면 100만 개의 꼭지점/노드와 400만 개의 모서리만을 의미합니다.그래서 그것은 특별히 조밀한 그래프도 아니었다.
관계형 데이터베이스는 그래프 구조를 처리할 수 있습니다.그 중에는 적당히 우아하게 처리할 수 있는 것도 있습니다(관계형 데이터베이스처럼 우아하게!).
관계형 데이터베이스에서 일반 그래프 처리의 열쇠는 RCTE(Recursive Common Table Expression)입니다.이것에 의해, 행의 루트 세트를 선택하는 쿼리와 지금까지 선택한 행의 네이버를 정의하는 쿼리를 조합하는 것으로, 기본적으로 일련의 행에 걸쳐 반복적으로(재귀적이지 않게) 쿼리를 확장할 수 있습니다.구문은 좀 투박하지만 일반적이고 강력합니다.
RCTE는 Postgre에서 지원됩니다.SQL, Firebird, SQL Server 및 DB2에 있는 것 같습니다.Oracle은 다르지만 동등한 구조를 가지고 있습니다.최근 버전은 적절한 RCTE를 지원한다고 읽었습니다.MySQL은 RCTE를 지원하지 않습니다.MySQL을 사용하고 있지 않다면 Postgre를 사용하는 것을 추천합니다.SQL은 기본적으로 모든 면에서 훨씬 더 나은 데이터베이스입니다.
그러나 일반적인 그래프는 지원하지 않고 트리만 지원할 필요가 있는 것 같습니다.이 경우, 보다 구체적인 옵션이 준비되어 있습니다.
하나는 고전적이지만 다소 당황스러운 중첩 세트입니다.
보다 간단한 방법은 각 행에 경로를 저장하는 것입니다.이것은 트리에서 행의 위치를 나타내는 문자열이며, 노드의 경로는 서브노드의 경로 접두사라는 속성을 가지고 있습니다.이를 통해 노드 A는 노드 B의 자식입니까?), "노드 A와 노드 B의 가장 낮은 공통 상위 노드"에 대한 다양한 쿼리를 매우 효율적으로 수행할 수 있습니다.r?) 등)을 참조해 주세요.예를 들어 루트에서 트리로 이동하여 슬래시를 사용하여 행의 경로를 구성할 수 있습니다.이것은 간단하게 구성할 수 있지만 트리를 재배치할 경우 유지보수에 주의해야 합니다.경로 열을 사용하면 단순히 다음을 추가하여 쿼리를 지정된 트리로 제한할 수 있습니다.and path like '23/%'
,어디에23
루트의 ID입니다.
따라서 그래프 데이터베이스가 그래프 데이터를 저장하고 조회하는 가장 좋은 방법일 수 있지만, 유일한 옵션은 아닙니다. 따라서 그래프 데이터베이스를 사용하여 모든 데이터를 하나의 데이터베이스에 저장할 수 있는 이점과 비교할 수 있습니다.
저는 Binary Nerd에 대부분 찬성합니다만, 변형을 추가하고 싶습니다.라이브 데이터를 Neo4j에 저장한 후 통계/보고에 필요한 데이터를 추출하여 MySQL에 넣을 수 있습니다.검색은 Neo4j-Lucene 통합으로 하겠습니다.
IN을 사용하면 쿼리를 개선할 수 있습니다.
SELECT *
FROM items
WHERE item_id IN (45, 345435, 343, 78, 4522, 676, 443, 4255, 4345)
관계형 데이터베이스가 트리 구조를 저장하는 데 서툴다는 것도 완전히 사실이 아닙니다.물론 MySQL에는 더 쉽게 할 수 있는 기능이 없지만 대부분의 다른 데이터베이스에서는 잘 지원하고 있습니다.Oracle은CONNECT BY
대부분의 메인스트림 RDBMS에는 어떤 형태의 재귀 쿼리가 있습니다. MySQL은 주목할 만한 예외입니다.아마 포스트그레를 한번 봐주셨으면 합니다.SQL이 고객의 요구를 충족하는지 확인합니다.
언급URL : https://stackoverflow.com/questions/2541891/is-it-a-good-idea-to-use-mysql-and-neo4j-together
'programing' 카테고리의 다른 글
64비트보다 큰 값을 반환하는 bit_count 함수를 지원하는 mariadb 버전 (0) | 2022.09.09 |
---|---|
Spring Boot 2 JPA 어플리케이션에서 MariaDB에서 InnoDB 또는 XtraDB를 스토리지 엔진으로 선택하는 방법 (0) | 2022.09.08 |
Vuex에서 Mixin 글로벌 메서드 호출 (0) | 2022.09.08 |
mysqld.service 작업에 실패했습니다. "systemctl status mysqld.service"를 참조하십시오. (0) | 2022.09.08 |
Python에서는 어떻게 태플 비교가 이루어집니까? (0) | 2022.09.08 |