지난번 포스팅에서는 기본적으로 중첩 집합 방식 알고리즘이 어떤 식으로 작동하는지에 대해 알아봤습니다.
중첩 집합 방식에 대한 설명 - [Algorithm] 중첩 집합(1)
이번 포스팅에서는 중첩 집합 알고리즘을 통해 구현한 댓글에서 하나의 댓글이 지워지는 로직을 어떤 방법으로
구현할 것인지 생각해보고 그로 인해 생기는 문제점은 없는지 알아보겠습니다.
만약 위의 구조에서 #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 |