2012-03-10 2 views
2

예약 시스템과 같은 호텔 객실에서 디자인 조언을 찾고 있습니다. 지금까지 많은 내용을 읽었으며 특정 날짜 범위에서 사용할 수있는 객실 목록을 반환하는 쿼리가 있습니다.호텔 예약 시스템 설계 - 여러 방을 사용하는 예약

내 검색은 현재 사용자가 검색하는 전체 예약 기간 동안 사용 가능한 객실 만 반환합니다. 여러 객실로 요청을 처리 할 수 ​​있도록이 항목을 확장하고 싶습니다. 나는. 사용자가 기간을 검색하면 처음 2 일 동안 1 호실을 사용할 수 있으며, 그 다음 2 일째에는 2 호실로 전환해야합니다.

현재 다음 쿼리를 사용하여 내 가용성 조회를 수행합니다.

Dim available = From k In rooms _ 
      Group Join r In db.Reservations.Where(Function(fx) (fx.DateIn >= Date_From And fx.DateIn < Date_To) Or (fx.DateOut > Date_From And fx.DateOut <= Date_To)) On k Equals r.Room Into Group _ 
      From r In Group.DefaultIfEmpty 
      Where r Is Nothing 
      Select k 

디자인을 변경하거나 현재 디자인을 확장하여 예약 당 여러 객실을 허용하려면 어떻게해야합니까? 나는 조금 비틀 거린다!

미리 감사드립니다.

+0

.net은 말할 수 없지만 SQL로 코딩 할 수 있습니다. 그게 도움이 되겠습니까? –

+0

Angelo, 저는 일부 SQL을 보는 데 관심이 있습니다! – Tom

+0

문제를 해결할 수 있습니까? 그렇다면 어떻게? 그리고 여기에 나온 답 중 하나가 도움이 되었습니까? –

답변

1

각 객실이 내림차순으로 열리는 가장 긴 시간순으로 정렬되어 사용자의 도착 날짜에 사용 가능한 객실을 검색하기 위해 초기 쿼리를 변경 한 경우 어떻게됩니까? 그 시간이 그 사람의 체류를 충당하기에 충분하다면, 당신은 끝났습니다. 그렇지 않은 경우 재발합니다. 다시 쿼리하여 첫 번째 룸을 사용할 수 없게 된 날짜에 사용 가능한 룸을 검색하고 각 룸이 내림차순으로 열리는 가장 긴 시간순으로 다시 정렬합니다. 사용 가능한 객실이없는 날짜를 맞출 때까지 또는 그 사람의 숙박을 충당 할 수있는 충분한 공간을 발견 할 때까지 계속하십시오.

  • 룸 : 1 : 1/1에서 사용 가능한 1/10 다음과 같은 가용성 3 개 방은있다 - 예를 들어

    ,의 당신이 1/1에서 예약을 예약하고 싶은 사람이 있다고 가정하자 사용 가능한 1/1 룸 3

  • 1/5에서 : 룸 2
  • 1/9에 1/5에서 사용 가능한 1/10

첫 번째 질문은 어느 객실 참조하는 것 1/1에서 이용 가능하며, 방 1과 2를 반환합니다. 그러나 각 방이 열려있는 시간 중 가장 긴 시간으로 정렬하기 때문에 결과는 방 1이됩니다. 두 번째 쿼리는 1/10에 사용할 수있는 방을 확인하는 것입니다 (첫 번째 방 1은 사용할 수 없음). 그러면 방 3이 반환됩니다. 그러면 방 3이 그 사람의 예약을 만족시킬 수있을만큼 충분히 열려 있고 완료되었다는 것을 알 수 있습니다.

+0

감사합니다. Kevin, 나는이 논리를 시험해보기 시작합니다. – Tom

+0

@Tom 혹시 이걸 작동 시키셨습니까? 그렇다면, 그것을 upvoting하고 선택한 대답으로 표시 고려하시기 바랍니다. 그렇지 않다면, 나는 당신이 생각해 낸 해결책에 대해 듣고 싶습니다. –

0

좋아 SQL 그렇게 : 충분한 공간이 반대의 문제가 될 것이다이 경우

표 room_booking는 roomid INT (FK to room table), from DATE, to DATE

그렇게 결정과 같다 : 방문의 기간에, 상황 곳이있다 NO ROOM을 이용할 수 있습니까? 그래서 우리는 며칠 만에 프레임을 분할했습니다. 왜냐하면 방이 귀하의 경우 시간당 임대되지 않았기 때문입니까? 아니면 그것을 선택했기 때문입니다.

그래서 선택 전 방문을 위해 매일을 결정한 다음 그 날 각각에 대해 얼마나 많은 무료 객실을 계산해야합니다.

그런 다음이 :

SELECT count(roomid) - (SELECT count(id) from room) as numOfFreeRooms 
FROM room_booking 
WHERE '2012-03-10' >= from AND '2010-03-10' <= to 

하면 모든 행 반환 '0'(당일 예약 모든 객실을 의미) 다음 고객의 요청을 수행 할 수 있습니다.

성능이 이보다 좋으면 개선 될 수 있지만 더 복잡합니다.

+0

Angelo, 노력에 감사하지만 근본적으로 내 현재 코드가하는 것과 같다고 생각합니다. 내가 원하는 것은 시작일과 종료일의 전체 기간 동안 객실을 사용할 수없는 시나리오로 코드를 확장하므로 동일한 기간 동안 여러 객실의 가용성을 검색하는 것입니다. – Tom

+0

@Tom 내가 작성한 코드는 어떤 방을 사용할 수 있는지에 상관없이 방을 사용할 수 있는지 상관하지 않습니다. 그래서 10 일 동안 10 개의 다른 방이 될 수 있습니다. 결과는 똑같습니다. –

+0

@Tom 제발 시간 기간 내에서 매일 SQL을 호출해야하므로, 10 일 방문을 위해서는이 10 번 전화해야한다는 점에 유의하십시오. –

0

내 두 번째 해결 방법 (첫 번째 의견에 대한 의견에서 말했듯이)은 상당히 복잡하지만 매우 효율적이라고 생각합니다.

나는 구체적인 내용에 관심이 있다면 내가 할 수있는 것을 볼 것입니다.

문제 : 매일 모든 방이 사용 가능하거나 차단되는 추상화를 만듭니다. 우리는 손님이 방문하고 싶어하는 시간에 가능한 객실에 관심이 있습니다. 게스트의 재배치가 가장 적은 객실을 선택하고 싶습니다.

초록 : 우리는 매일 매일 2의 거듭 제곱 (DAY VALUE)으로 표현되는 공간/일 조합의 2 차원 매트릭스를 생성합니다. 사용 가능한 공간에는 해당 DAY VALUE가 있습니다. SERO의 가치로 차단 된 방. 그래서 만약 우리가 모든 방을 합하면 방의 조합이 전체 시간을 충족시키는지를 결정할 수 있습니다.

더 구체적으로 : 우리가 ROOM의 모든 VALUES의 합을 얻은 후에는 OR 연산의 결과를 값의 합과 비교하여 주어진 방의 조합이 전체 숙박을 채우는지를 결정하기 위해 2 진 OR 함수를 사용할 수 있습니다 모든 일 동안.

DAYVALUE는 dayTable에 저장되지 않습니다. 그것은 모든 요청 (2^(startDay를-DAY))에 대해 계산됩니다

콘크리트 :

1) 당신은 모든 일을 포함하는 테이블을 작성해야합니다. 정확히 하나의 열에는 날짜가 포함됩니다 (시간이없고 시간대가 없습니다). 나는 백 년이 될 때까지 지금부터 모든 날을 포함하도록 권고 할 것이다. (따라서 한 번만 채워야합니다). (참고 : 이렇게하면 SQL 쿼리에 한 번 매일을 선택할 수 없습니다 문제 해결)

2) 당신은이 같은 출력을 생성하는 VIEW 생성 :

DAY  ; DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn 
20120313 ;  1 ;  0 ;  0;  1 ;  1 ; ... ; 
20120314 ;  2 ;  2 ;  0;  2 ;  2 ; ... ; 
20120315 ;  4 ;  4 ;  0;  0 ;  4 ; ... ; 
20120316 ;  8 ;  8 ;  0;  0 ;  0 ; ... ; 
20120317 ;  16 ; 16 ; 16; 16 ;  0 ; ... ; 

3)이의 SUM 생산을 . 방 값 중 하나가 모든 시간을 DAYVALUE의 합과 일치하는 (따라서 사용할 수있는 경우 4 매 2의 OR 값을 생성 성공하지 않은 경우

DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn 
     31 ; 30 ; 16; 19 ;  7 ; ... ; 

4)))

5 참조 결과 아무도 당신이 3 실 등이 진행해야 할 두 개의 객실에 일치하지 않으면 DAYVALUE

ROOM1 OR ROOM2 = 30 <> 31 
ROOM1 OR ROOM3 = 31 == 31. This is a valid match of rooms. 

6)의 합과 비교합니다.

이 절차를 사용하면 방문시 사용할 수있는 올바른 객실 세트가 항상 생성되고 올바른 방법으로 데이터베이스를 구성하거나 충분한 양의 객실을 보유한 경우 쿼리가 적절한 시간 내에 완료되어야합니다 .

즐거운 시간 되시길 바랍니다.

+0

100 년 동안 ~ 36,500 일이있다. 매일이 2의 거듭 제곱으로 표시되면 DAYVALUE는 2^36,500까지 올라갈 수 있습니다. 이 숫자를 나타내는 숫자는 36,500 비트 (~ 4.4 킬로바이트)이며 이는 방을 1 일 동안 사용할 수 있는지 여부를 나타냅니다. 모든 36,500 일 동안 1 개의 객실에 대한 가용성을 저장하려는 경우 4.4kb/일 * 36,500 일 = 160,600kb (~ 156 메가 바이트)가 필요합니다. 사용 가능한 공간 수와이 데이터 구조를 저장하는 데 필요한 공간의 양을 곱하면됩니다. –

+0

@KevinPang 당신은 완전히 나를 오해했습니다. 36500 일을 절약해야합니다. 기간. 다른 건 없어. 다른 하나는 모든 요청에 ​​대해 호출하고 저장하지 않을 뷰입니다. –

+0

나는 아직도 그 때 이해하지 않는다. 당신은 매일 매일이 2의 거듭 제곱 인 DAYVALUE로 표현되었다고 말했습니다. 36,500 일이있는 경우 최대 DAYVALUE는 2^36,500입니다. 맞습니까? 그렇다면 큰 숫자를 사용하여 스토리지에 미치는 영향을 생각해야합니다. ROOM1은 36,500 일 동안 사용 가능하다고 가정 해 보겠습니다. ROOMVALUES의 합은 1 + 2 + 4 + 8 + 16 + ... + 2^36,500입니다. 그 맞습니까? 그렇다면이 모든 값과 합계를 저장하기 위해 많은 공간이 필요합니다. 처리 시간도 문제가됩니다. –

관련 문제