안녕하세요, 오늘은 물리삭제와 논리삭제에 대해 간단하게 정리하려고 합니다 :)
요즘 SQL로 데이터관리를 하기 위한 여러 방법들을 배우고 있는데요, 흥미로운 주제를 발견해서 아, 이건 정리해야겠다라는 생각이 들었습니다.
그것은 바로 어떤 row를 삭제하는 방법에는 크게 2가지 방법이 있다는 사실입니다.
그 2가지 방법은 바로 '물리 삭제’와 ‘논리 삭제'입니다.
일반적으로 데이터를 삭제해야할 때 그냥 row를 바로 삭제해버리는 것을 ‘물리 삭제’라고 합니다.
반면에 ‘논리 삭제’는 삭제해야할 row를 삭제하지 않고, ‘삭제 여부’를 나타내는 별도의 컬럼을 두고, 거기에 ‘삭제되었음’을 나타내는 값을 넣는 것을 말합니다.
예를 들어, 어떤 쇼핑몰에서 각 고객의 주문 내역을 저장하고 있는 아래와 같은 order 테이블이 있다고 합시다.
이 테이블에서는 row 하나가 주문 내역 하나를 나타내고 있습니다.
그런데 이때 2번 주문을 한 고객이 주문을 취소했다고 해봅시다. 그래서 주문 내역을 삭제하려고 할 때, 만약 ‘물리 삭제’를 한다면 다음과 같이 제거가 될 것입니다.
하지만 만약 ‘논리 삭제’를 한다면 아래 그림과 같이 테이블에 is_cancelled 같은 컬럼을 추가하고 해당 컬럼에 주문이 취소되었음을 나타내는 Y(es)라는 값을 넣어주면 되는데요.(is_cancelled, is_deleted 등 사용할 수 있는 컬럼 이름은 사용자가 편하게 지으시면 됩니다.)
그러니까 보통 행을 삭제하는 '물리 삭제'는 DELETE문을 쓰면서 이 작업을 수행하게 되는데 ‘논리 삭제’를 할 때는 DELETE 문을 쓰는 게 아니라 새로운 컬럼을 추가해야하는 UPDATE 문을 써야 합니다.
결국 '물리 삭제'와 '논리 삭제'는 정책상의 차이를 나타내는 분류라고 할 수 있습니다.
그렇다면 직접 행을 삭제하는 행위를 하는 대신 삭제의 의미를 나타내는 새로운 컬럼을 생성하는 논리 삭제를 하는 이유가 무엇일까요?
위의 예시와 같은 경우를 보자면, 비록 사용자가 주문을 취소했다고 해도 해당 주문은 사용자의 취향, 기호 등이 반영된 소중한 데이터입니다. 즉, 기업 입장에서는 고객 분석을 위해 필요한 소중한 데이터라는 거죠. 그래서 설사 소비자는 주문을 취소(삭제)했다고 하더라도 기업은 해당 데이터를 계속 보관하고 있는 겁니다.
하지만 이런 논리 삭제도 약간의 단점은 있는데요.
먼저, 나중에 삭제되지 않고 유효한 row들만 조회해야할 때는 삭제 컬럼을 조회하지 않는다는 WHERE 절에 별도의 조건을 추가해줘야해서 번거롭다는 단점이 있습니다.
그리고 실제로 row를 삭제하는 것이 아니기 때문에 아무리 삭제를 해도 데이터베이스 내의 저장용량은 줄어들지 않는다는 단점도 있습니다.
이런 단점을 보완하기 위해 기본 정책은 논리 삭제로 두되,
- 이미 데이터 분석에 활용되었거나
- 고객이 동의한 데이터 보유기간이 지난 row들은
정기적으로 물리 삭제하는 방법을 활용하기도 한답니다. 나중에 실무에서 SQL을 사용한다면 회사는 어떤 식으로 삭제 정책을 운영하고 있는지 한 번 살펴봐야겠습니다.
오늘도 저의 글을 읽어주셔서 감사합니다 ;)
'데이터분석 공부하기' 카테고리의 다른 글
다항 회귀 (0) | 2022.03.17 |
---|---|
선형 회귀 (0) | 2022.03.17 |
카디널리티와 ERM (0) | 2021.12.05 |
MySQL 데이터 타입(Data type) (0) | 2021.11.21 |
모델링 기본 정리 (0) | 2021.11.07 |
댓글