ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mongoDB에서 data history 관리하기
    mongoDB 2022. 7. 31. 17:34

    문제사항

    • 현재 사용하는 mongoDB에서는 과도하게 하나의 doc에 데이터를 embedded 시켜서 document 사이즈를 초과하게 되는 문제가 발생했다. 이는 history관련 로직이 문제였는데, 특정 data가 수정되었을 때 새로운 doc를 생성해서 관리하는 것이 아닌 history라는 배열에 이전 정보를 보관해서 저장하기 때문에 문제가 되었다. 사실 one-to-many이지만 one-to-few이기 때문에 embedded시켜도 문제가 없어야 하지만 애초에 doc사이즈가 매우 크기 때문에 문제가 발생했다.

    해결 방법

    • 이를 해결하기 위해 parent, visible 필드를 추가하고 data가 변경되면 기존의 doc을 clone하여 현재 상태의 snapshot으로 doc을 하나 생성한 뒤 parent에는 clone한 대상(맨 처음 생성한 doc)의 id를 적고 visible: false로 변경하여 query 조회 시에는 보이지 않도록 조치하였다.
    1. 맨 처음 생성한 doc는 parent가 된다. 만약 새로운 doc를 parent로 변경하게 되면 id가 변경되기 때문에 해당 collection의 data에 대해 id로 reference를 갖고 있는 다른 doc에서의 접근이 최신 정보를 가져올 수 없게 된다.
    2. update시에 기존 doc을 clone하여 새로운 doc로 저장한다. 이 때, visible field를 false로 변경하여 query로 보이지 않게 조치하고 parent에 처음 생성한 doc의 id를 넣는다.
    3. clone한 뒤에 변경한 정보에 맞게 최초 생성한 doc를 update한다. 이 때 version에 1을 더해준다.

     

    댓글

Designed by Tistory.