게시물과 댓글을 남기고 싶은 블로그를 만들고 있다고 가정합니다. 그래서 자동 증분 정수 'id'열이있는 'posts'테이블과 외래 키 'post_id'가있는 'comments'테이블의 두 테이블을 만듭니다.
그런 다음 가장 일반적인 쿼리 일 것입니다. 게시물과 모든 댓글을 검색하는 것입니다. 관계형 데이터베이스에 익숙하지 않은 나에게 가장 명백한 접근 방식은 다음과 같은 쿼리를 작성하는 것입니다.
SELECT id, content, (SELECT * FROM comments WHERE post_id = 7) AS comments
FROM posts
WHERE id = 7
어느 것이나 원하는 게시물의 ID와 내용을 배열에 깔끔하게 패키지 된 모든 관련 주석 행과 함께 제공합니다 (JSON에서 사용하는 것과 같은 중첩 표현). 물론, SQL 및 관계형 데이터베이스는 이와 같이 작동하지 않으며, 가장 가까운 것은 '포스트'와 '코멘트'를 결합하여 불필요한 데이터 중복을 반환하는 동일한 포스트 정보를 반복하는 것입니다. 모든 행에서), 이는 처리 시간이 모두 데이터베이스를 모으기 위해 데이터베이스와 내 ORM에서 모두 파싱하고 실행 취소하는 데 소비됨을 의미합니다.
ORM에 게시물의 댓글을 간절히로드하도록 지시하더라도 게시물에 대해 하나의 쿼리를 발송 한 다음 두 번째 쿼리를 사용하여 모든 댓글을 검색 한 다음 클라이언트 측에 정리하는 것이 가장 좋습니다. 또한 비효율적입니다.
관계형 데이터베이스는 입증 된 기술 (지옥보다 나이가 많음)이며 수십 년 동안 수많은 연구가 진행되어 왔으며, 그 이유가 실제로 존재한다고 확신합니다. SQL 표준)은 기능을 수행하도록 설계되었지만 위에서 설명한 접근 방식이 왜 불가능한지 잘 모르겠습니다. 레코드 간 가장 기본적인 관계 중 하나를 구현하는 가장 간단하고 명백한 방법 인 것 같습니다. 관계형 데이터베이스가 이와 같은 것을 제공하지 않는 이유는 무엇입니까?
(면책 조항 : 나는 대부분 Rails 및 NoSQL 데이터 저장소를 사용하여 웹 응용 프로그램을 작성하지만 최근 Postgres를 사용해 보았으며 실제로 그것을 좋아합니다. 관계형 데이터베이스를 공격한다는 의미는 아닙니다. 방금 혼란 스럽습니다.)
Rails 앱을 최적화하는 방법이나 특정 데이터베이스 에서이 문제를 해결하는 방법을 묻지 않습니다. 나는 SQL 표준이 반 직관적이고 낭비 적 인 것처럼 보일 때 왜 이런 식으로 작동하는지 묻고 있습니다. 원래의 SQL 디자이너가 결과를 이렇게 보이길 원하는 역사적인 이유가 있어야합니다.