지난번 포스팅에서는 기본적으로 중첩 집합 방식 알고리즘이 어떤 식으로 작동하는지에 대해 알아봤습니다.
중첩 집합 방식에 대한 설명 - [Algorithm] 중첩 집합(1)
댓글 알고리즘 - 중첩집합(1)
지난번 포스팅에서는 경로 열거 방식 알고리즘을 적용해서 댓글을 구현해 봤습니다. 경로 열거 방식이 궁금하다면 - [Algorithm] 경로 열거 방식 경로 열거 방식에서는 경로 값의 무결성과 정합성
goodbyeanma.tistory.com
이번 포스팅에서는 중첩 집합 알고리즘을 통해 구현한 댓글에서 하나의 댓글이 지워지는 로직을 어떤 방법으로
구현할 것인지 생각해보고 그로 인해 생기는 문제점은 없는지 알아보겠습니다.
만약 위의 구조에서 #6의 댓글을 지우려면 아래와 같이 쿼리를 날리면 됩니다.
BEGIN TRAN -- 롤백 해주기 위해서 트랜잭션을 열어둠
DELETE dbo.COMMENT_TEST_NESTED WHERE comment_id = 6
위와 같은 방법으로 DELETE를 하게 되면 데이터의 정합성과 무결성이 깨지지 않았을지 걱정이 될 수 있지만,
사실 아주 자연스럽고 문제없는 로직입니다. 이전 포스팅에서 자식 노드와 부모 노드 사이의 관계를 정리했는데,
특정한 노드 Nx에 대해서 Nx의 자식은 아래의 식을 만족했습니다.
Descendants Of Nx = ∀N ∈ (N.nsleft > Nx.nsleft ^ N.nsleft < Nx.nsright)
즉 위의 그림에서 #6이 지워지면 자연스럽게 #6의 nsleft 값과 nsright 값이 사라지게 되지만, #6의 제거가 #7에는
어떠한 영향도 미치지 못합니다. #4의 자식 노드가 될 조건은 nsleft 가 6보다 크고 13 보다 작으면 되므로,
#4의 직속 자식노드로 승격이 되었다고 볼 수 있습니다. 그림으로 표현하면 아래와 같습니다.
그럼 실제로 깊이(단계)가 줄어들었는지 DBMS를 통해 쿼리 하여 확인해봅시다.
위 쿼리문에서 트랜잭션을 열어준 상태로 DML 쿼리를 하였으니 원복 하기 위해 ROLLBACK TRAN을 날려준 후에
아래와 같이 쿼리를 날려봅시다.
ROLLBACK TRAN
SELECT
COUNT(*) AS cnt
FROM dbo.COMMENT_TEST_NESTED c1 WITH(NOLOCK)
INNER JOIN dbo.COMMENT_TEST_NESTED c2 WITH(NOLOCK) ON c1.nsleft BETWEEN c2.nsleft AND c2.nsright
WHERE c1.comment_id = 7
그림을 보면 #6을 DELETE 하기 전의 #7의 단계는 4단계가 맞음을 알 수 있습니다.
이제 위에서 적어준 DELETE 쿼리를 해준후 다시 확인해봅시다.
DELETE dbo.COMMENT_TEST_NESTED WHERE comment_id = 6
SELECT
COUNT(*) AS cnt
FROM dbo.COMMENT_TEST_NESTED c1 WITH(NOLOCK)
INNER JOIN dbo.COMMENT_TEST_NESTED c2 WITH(NOLOCK) ON c1.nsleft BETWEEN c2.nsleft AND c2.nsright
WHERE c1.comment_id = 7
그럼 #7노드의 단계가 4 -> 3으로 상승한 것을 볼 수 있습니다.
여기까지 중첩 집합 알고리즘을 사용한 댓글 구조에서 댓글의 삭제 방법을 알아봤습니다.
다음 포스팅에서는 해당 구조를 기반으로 새로운 답변을 생성하는 경우 어떠한 구조로 로직을 생성해야 하는지
알아보겠습니다 :)
'알고리즘' 카테고리의 다른 글
댓글 알고리즘 - 중첩집합(3) (2) | 2021.07.22 |
---|---|
댓글 알고리즘 - 중첩집합(1) (4) | 2021.07.22 |
댓글 알고리즘 - 경로열거(Path Enumeration) (0) | 2021.07.22 |
댓글 알고리즘 - 인접목록방식 (3) | 2021.07.21 |