sallyyy
225
2019-06-20 23:11:12
4
190

예약 db설계 질문입니다


mysql로 객실예약프로그램 db설계를 하려는데

객실(Room) 테이블엔 객실타입과 객실명들이 등록되어있구요

ex)A타입 a객실,b객실.... 

     B타입 a객실,b객실...

해당 날짜의 객실을 예약하면

예약(Reservation)테이블엔 날짜와 예약자명 ,객실명이 저장됩니다

문제가되는것이

객실종류별 잔여 객실수로 예약현황(예약 가능. 불가능) 을 확인해야하는데

예를들어 '2019-06-20' 일의 A타입의 a객실을 예약한뒤 


날짜로 해당일에 예약가능한 객실을 조회할때 b객실이 공석으로 예약기 가능함으로 보이게 하려면 어떻게 해야되나요?



0
0
  • 답변 4

  • 아스키
    9k
    2019-06-21 01:01:57

    예약상태 Y/N 컬럼 하나 추가해서 예약상태 구분로 조회해보세요.

    0
  • ISA
    392
    2019-06-21 08:31:21

    저도 최근에 비슷한 걸 만든적 있는데 프론트단에서 처리했던거 같습니다. 예약현황은 민감정보가 아니고 중복등은 벡엔드에서 막으면 되는 부분이라 판단 일자 총 사용시간 방타입 등만 벡엔드에서 받아서 처리했네요.... 

    0
  • dsms
    743
    2019-06-21 09:17:05
    예약관련해서 이력 테이블 하나 더만드시는것 추천. 플래그 컬럼사용하면 나중에 확장성 떨어집니다.
    0
  • 르매
    560
    2019-06-21 10:56:10

    1. 특정 일자 (또는 기간)에 대해 객실 타입별로 공실 개수의 목록을 조회

    2. 1항에서 공실이 있는 객실 타입을 선택하면 공실인 객실의 목록을 조회

    MS-SQL이라면 Indexed View를 사용해서 타입별 공실 개수를 쉽게 관리할 수 있는데, MySQL은 View에 인덱싱하지 못하기 때문에 별도의 집계 테이블을 만들고 백엔드 프로그램에서 가산/감산을 직접 해줘야 성능 문제를 피할 수 있을 듯 합니다. 다만, 규모가 작은 사이트라면 별도 집계 없이 실시간 집계 쿼리로 커버하셔도.. 뭐.. 되기는 하겠죠?

    부가 속성을 위한 컬럼은 제가 모르니 패스하고.. 대략 이런 구조가 되지 않을까요?

    크게 두 가지를 고려해야 하는데..

    첫째, 예약 일자

    reservation을 설계할 때 예약일자와 관련해 두 가지 선택지가 있는데..

    - 기간의 시작일자와 마지막일자를 각각의 컬럼으로
    - 일자 컬럼을 하나만 두고 기간의 일수 만큼 레코드를 삽입 (기간이 3일이면 레코드가 3개)

    전자는 한 번에 레코드 1개씩 처리하기 때문에 트랜잭션 관리가 용이하지만 기간의 겹침을 Constraint로 막아 주지 못하는 단점이 있고, 후자는 장/단점이 반대가 됩니다.

    둘째, 예약된 객실 개수 집계

    객실 타입별 예약된 객실 수의 집계 테이블은.. View로 표현한다면 아래와 같습니다.

    CREATE VIEW `reservation_stat` AS
    SELECT R.room_type, RSV.reserve_date, COUNT(*) AS room_count
    FROM room R
    	INNER JOIN reservation RSV ON RSV.room_id = R.room_id
    GROUP BY R.room_type, RSV.reserve_date

    위의 View와 같은 결과가 기록되도록 예약과 취소가 반복될 때마다 reservation_stat_by_room_type 테이블의 reserved_room_count 값을 연산해주고, 주기적으로 뷰의 결과와 동기화 시켜주는 프로세스 (혹시 프로그램의 버그로 집계 정보가 틀렸을 경우를 대비) 를 scheduled job으로 등록해볼 수 있습니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.