인프런 커뮤니티 질문&답변
4주 3회차 과제
해결된 질문
작성
·
14
·
수정됨
0
데이터베이스 고윳값 제약으로 예방하는 구현에 대해서 조사했습니다.
동일 일자와 동일 타임슬롯인 경우 중복
Booking에 unique index를 생성하는 것인데 동일 일자 (when)과 동일 타임슬롯(time_slot_id) 조건을 생성하면 됩니다.
CREATE UNIQUE INDEX uq_booking_slot ON bookings (when, time_slot_id);class Booking(SQLModel, table=True):
__tablename__ = "bookings"
__table_args__ = (
UniqueConstraint("when", "time_slot_id", name="uq_booking_slot"),
)
attendance_status 필드값이 cancelled인 경우
PostgreSQL의 경우 partial unique index가 가능합니다. where를 사용해서 field가 cancelled가 아닌 경우에 unique 제약을 걸면 됩니다.
CREATE UNIQUE INDEX uq_booking_slot ON bookings (when, time_slot_id) WHERE attendance_status <> 'cancelled' ;class Booking(SQLModel, table=True):
__tablename__ = "bookings"
__table_args__ = (
UniqueConstraint("when", "time_slot_id", name="uq_booking_slot"), postgresql_where=text("attendance_status <> 'cancelled'")
)
다중 컬럼에 대한 unique는 종종 사용하는 방법이었는데 where를 이용해서 조건을 설정할 수 있는 건 이번에 첨 알았습니다. 필요하면 python에서 처리하곤 했었는데 데이터베이스 기능으로 이용하는게 레이스 컨디션도 피할 수 있고 장점이 있어보이네요.
실무에 적용할때도 꼭 이용해보겠습니다.
답변 1
0
한날
지식공유자
정석으로 잘 구현하셨어요. 👍
SQLite에서는 동작하지 않는 방식이고, 실 서비스에서 여러 사용자가 접근하는 용도로 SQLite를 사용하지는 않지만, SQLite에서 고윳값 제약을 조건부로 적용하는 효과를 보는 방법도 한 번 고민해보세요. 가령, 버저닝(versioning)을 한다면, SQLite에서도 비슷한 효과를 볼 수 있는데, SQLite를 위해서가 아니더라도 버저닝을 활용하는 정책이나 기능이 필요하다면 고려해볼 수 있지요.




