기존의 스키마 구조와 다른 스키마를 채택해주셨네요!
생각해보면 좋을 몇 가지 질문을 남겨두겠습니다 :)
해당 스키마의 장점과 단점은 무엇이라고 생각하시나요?
사용자의 이전 예약 기록을 남겨두어야 하기 때문에, DELETE 를 할 수는 없을 것 같아요. 지나간 날짜의 레코드를 남겨두게 된다면, 시간이 지날수록 데이터가 많아지지 않을까요? Seat Schedule 과 더불어 Reservable seat 테이블 레코드도 늘어날테니 저장되는 데이터가 2배가 될 것 같아요 🤔
현재 이슈 내용에서는 reservation 스키마와 관련된 부분이 언급되지 않았는데, reservation 스키마는 이전과 동일한가요?
제시해주신 스키마 구조에서도 seat schedule 을 벌크 업데이트하게 될 것 같은데, 이 부분에 대해서는 어떻게 생각하세요?
개요
Seat
엔티티의 설계 방식을 변경하여 데이터 관리 효율 및 유지보수성을 개선문제 상황
Seat
엔티티에 날짜와 시간 데이터(availableDate
과availableTime
)가 포함되어 있는 기존 구조가 DB의 Seat 테이블을 지나치게 방대하게 만드는 문제가 있음.또한 서비스 정책 상 예약 가능 기간(2주)이 있기 때문에 가변적인 날짜 데이터를 주기적으로 벌크 업데이트해야 하는 오버헤드가 존재함.
개선 방안
날짜와 시간 데이터를
Seat
엔티티로부터 분리시켜SeatSchedule
이라는 새로운 엔티티에 편입시킴.→ 2주치의 날짜와 각 날짜에 대한 24개의 예약 가능 시간대를 저장 (14 x 24 = 168개의 고정된 수의 레코드)
하루가 지날 때마다 기존처럼
Seat
테이블 전체를 업데이트 하는 것이 아니라SeatSchedule
테이블을 업데이트함→ 지나간 날짜에 해당하는 레코드를 DELETE 또는 사용 안함 처리하고, 새로운 날짜에 해당하는 레코드를 INSERT함.
Seat
엔티티와SeatSchedule
엔티티는 다대다(N:M) 연관관계를 지니므로, 이를 중간에서 1:N, M:1 로 풀어낼 수 있는ReservableSeat
엔티티를 새로 추가함.→ 기존에
Seat
가 가지고 있던 좌석 수량(quantity
) 정보를ReservableSeat
에 넣음.→ 이제 주요 기능인 예약을 할 때는
ReservableSeat
엔티티를 사용하고, 그 외에 좌석이 가진 옵션을 조회하는 것은Seat
엔티티를 통해, 좌석이 가질 수 있는 예약 가능 날짜와 시간대 조회는SeatSchedule
엔티티를 통해서 함.