TIL/DB

[DB] soft delete vs hard delete (feat. isDeleted)

JoJobum 2022. 9. 5.

처음에 생각한 flow

의문이 생긴 배경과 의문

유저간의 가족구성을 할 때 한명이 가족을 만든 후,
만료 기한은 있지만 초대 인수는 제한이 없는 가족 초대 코드를 발급하고
나머지 가족 구성원들이 이 초대 코드를 입력하여 가족에 join하는 방식으로 구현하려고 할 때 생긴 의문이다

 

위의 가족 구성의 경우에는 최초의 한번 혹은 흔하지 않게 사용할 기능이기에 초대 코드에 대한 부분을 DB에 저장해도 크게 문제가 되지 않을 거란 생각이 드는데,
만약 이러한 특정 임시 코드를 발급해주어야하는 일이 수시로 많은 유저가 사용하는 기능이라면 임시코드를 발급한 것을 매번 DB에 저장하고 만료되면 삭제를 하던 isDeleted 컬럼을 업데이트하던 비효율적인 느낌인데 이러한 경우에 어떻게 효율적으로 만들 수 있을까??

 

사실 이러한 의문은 이상한 의문이였다. 결국 위에 언급한 DB에서 삭제하던 (Hard Delete) isDeleted 컬럼 같은 flag로 제어하던 둘 중 하나로 처리할 일이기에 둘 다 비효율적인 느낌인데?? 다른 방법 없나요? 는 해결하지 못한 의문이다.

대신 이러한 의문을 해결하기 위해 앞서 언급한 두 방법에 대한 비교를 통해 어설프게 줏어 들은 내용들을 한번 정리하면서 배울 수 잇는 경험을 할 수 있었다.

 

Hard Delete

데이터를 실제로 DB에서 삭제하는 것을 의미한다.

실제로 삭제하기에 데이터를 다시 복구할 수 없다. => Soft Delete를 하는 경우는 대부분 이 이유 때문에 Soft Delete를 사용한다고 한다.

 

Soft Delete 

데이터를 실제로 DB를 삭제하지 않고 flag 컬럼을 하나 만들어서 이를 통해 논리적인 삭제를 하는 것을 의미한다.

예를 들어 isDeleted 컬럼을 만들고 삭제 처리를 할 때 false 던 값을 true로 바꾸고 추후에 테이블에서 검색할 때 isDeleted가 true면 걸러내는 식으로 삭제된 값을 삭제된 것 처럼 제외한다.

 

이러한 soft delete의 문제점은 없을까??

 

검색을 하다가 찾은 내용은 Cardinality에 대한 내용이였다.

soft delete를 위해 isDeleted 컬럼을 만들어서 사용한다면 Cardinality가 낮아진다는 것이다.

Cardinality 는 전체 행에 대한 특정 컬럼의 중복 수치를 나타내는 지표

중복도가 낮으면 Cardinality 높다

중복도가 높으면 Cardinality 낮다

위 같은 판단 기준은 상대적인 것

 

예를 들어 주민등록번호는 중복되는 값 없지만, 이름은 주민 등록 번호에 비해 중복되는 값이 많기에 이름은 주민등록번호에 비해 Cardinality가 낮다. 성별을 나타내는 컬럼은 남/여로  2가지 값만 있을 것이고 이와 이름을 비교한다면 이름은 성별에 비해 상대적으로 Cardinality가 높을 것이다.

 

인덱스를 걸 때, 내가 원하는 데이터를 선택하는 과정에서 최대한 많은 데이터가 거르는 것이 성능이 좋을 것이다. 왜냐하면 많은 데이터를 선택할수록 full scan에 가깝기 때문이다.

 

고로 여러 컬럼을 동시에 인덱싱할 때, Cardinality가 높은 컬럼을 우선순위로 두는 것이 인덱싱 전략에 유리하다.

 

예를 들어 

0, A, 남 

1, A, 남 

2, B, 남 

3, B, 남 

4, C, 여 

5, C, 여

6, D, 여 

7, D, 여 

 

컬럼 주민등록번호, 이름, 성별로 검색을 한다하였을 때,

 

Cardinality가 높은 주민등록번호로 검색을 먼저 건다면 데이터를 하나만 들고 거기서 이름과 성별이 맞는지 체크할 것이다.

 

반면 낮은 순으로 성별, 이름, 주민등록번호 순으로 검색을 건다면 ex) 남, B, 2 를 찾는다면

남자인 0~3 을 찾을 것이고 거기서 이름인 B로 또 거르고, 주민등록번호 2로 원하는 데이터를 찾을 것이다. 

 

위와 비교했을 때 비효율적이라는 것이다.

 

 

참고 블로그

[DA] 삭제여부속성(soft delete) 사용은 신중해야 한다. (daonelab.com)

[database] 카디널리티(cardinality)란? | 코딩장이 (itholic.github.io)

 

 

반응형

'TIL > DB' 카테고리의 다른 글

[Oracle] APPEND 힌트와 Direct Load Insert  (1) 2024.02.14
[DB] Delete vs Truncate vs Drop  (0) 2022.08.17
[DB] Postgres 명령어  (0) 2022.08.17
[DB] 외래키를 사용해? 말어?  (0) 2022.07.16

댓글