2012-03-09 5 views
3

하루 (영업 시간)의 시간 범위를 감안할 때 현재 시간이 지정된 엔티티를 반환하는 색인을 어떻게 만들 수 있습니까?Google 애플리케이션 엔진을 사용하여 업무 시간 인덱싱

오픈 시간과 영업 시간 만 포함하는 목록 속성이 앱 엔진에서 작동 할 수 있다고 가정하는 실수를 저질렀습니다.

지금은 어느 정도 투자 솔루션없이 따로 시간의 긴 목록을 사용하고 있습니다
Select * FROM Business WHERE hours < now AND hours > now 

, 매우 보인다 매 ​​30 분마다 슬라이스 : 두 불평등 필터 목록에서 같은 값과 일치해야하기 때문에 다음은 실패 비효율적 :

[900, 930, 1000, 1030, 1100, 1130, 1200, 1230, 1300, 1330, 1400, 1430, ... ] 

사람은 열고 닫는 시간을 해싱하거나이 문제를 해결하는 영리한 방법을 알고?

답변

0

이 작업 중 하나는 각 비즈니스에 대해 영업 시간과 종료 시간을 설정하고 시간대가 맞는지 여부를 확인하는 것입니다.

그러나 큰 테이블을 사용하면 인덱싱으로 인해 두 가지 별도의 쿼리를 수행해야 할 수 있습니다. 하나의 쿼리는 시간이 opentime보다 크고 다른 쿼리는 closetime보다 작은 지 확인합니다. 이것은 두 개의 인덱스가됩니다.

이상적인 해결책은 아니지만 수행하려는 것보다 더 효율적일 수 있습니다.

+0

큰 테이블은 또한 하나의 속성에 부등식 만 허용하는 제한이 있습니다. 목록을 사용하려고 시도합니다. 쿼리가 필요한 레코드가 9000 개일 경우 두 개의 쿼리 솔루션에서 꽤 큰 쿼리 세트가 반환 될 것입니다. 비즈니스는 실제로 하루에 여러 개의 열린 쌍과 닫힌 쌍을 가질 수 있기 때문에 실제로 곱해진다. – scottzer0

2

새로운 답변 : 나는 그것에 대해 약간 생각했다. 나는 당신이 실제로 당신의 독창적 아이디어로 해결책을 가지고 있다고 생각한다. 각 비즈니스에 대해 현재와 같이 비즈니스가 열려있는 시간 만 저장하는 storehours ListProperty를 보유합니다. 그런 다음 현재 시간을 계산하고, 라운드 가장 가까운 반 시간에, 그래서 12시 50분 -> 1200 다음 쿼리를 할

now = 1200 
Select * FROM Business WHERE now in hours 

내가 적절한 GQL 쿼리 구문에 대한 확실하지 않다, 그러나 거기에 확실히이다 "in"필터.

OLD 대답 (읽기하지 마십시오) : 나는 비슷한하고 있어요 , 정말 "뭔가 다른 것을 시도"를 제외하고, 해결책이 없습니다.

먼저 열기 및 닫기 시간을 모두 저장해야합니다. 두 개의 개별 필드로 또는 9-5의 경우 '09001700'또는 'M09001700'과 같이 한 필드로 인코딩 할 수 있습니다. 또는 두 개를 숫자로 해시하는 경우이 방법이 큰 차이를 만드는 것은 아닙니다.

그러면 나쁜 소식입니다. 숫자 이론에서는별로 좋지 않습니다.하지만 여기서하려고하는 것은 세 번째 숫자에 대해 선형> 또는 < 비교를 할 수있는 방식으로 두 개의 선형 숫자 집합 (열기 및 닫기 시간)을 인코딩하는 것입니다. '지금'을 나타내는 나는 이것이 가능하다고 생각하지 않는다. 두 개의 숫자 중 하나를 열거 나 닫는 시간 중 하나에 대해서만 성공 또는 < 비교를 할 수있다. 그래서 한 부동산에서만 불평등을 수행 할 수 있다고 가정 할 때, 열린 쿼리 만 단 하나의 쿼리로 격리 할 수는 없다고 생각합니다.

또한 두 개의 쿼리를 수행 할 필요가 없다고 생각합니다. 열린 시간에 대해 하나의 쿼리 만 수행 한 다음 필터를 통과하여 닫힌 쿼리를 확인하면됩니다. 너라면

반드시 두 개의 큰 세트를 함께 사용해야 할 필요는 없습니다. 지금> opentime 인 모든 항목을 쿼리하고, 결과를 수동으로 필터링하여 현재 < 마감 시간이있는 항목을 찾을 수 있습니다.클로저 타임을 기준으로 쿼리를 정렬하면 필터링이 다소 쉬워집니다.

내가 궁극적으로 사용했던 해결책은 매장 시간에 전혀 쿼리하지 않고 제한된 데이터 집합을 반환하는 쿼리를 작성한 다음 매장 시간을 기반으로 반환 된 결과를 필터링하는 것입니다. . 예를 들어 사용자가 위치를 기준으로 검색하고 위치를 기반으로 비즈니스를 쿼리 한 다음 영업 시간으로 결과 비즈니스를 필터링 한 다음 사용자에게 공개 된 비즈니스 만 표시합니다.

+0

실제로 Expando 모델을 사용하는 경로를 살펴보고 요일과 해당하는 열린 시간을 가장 가까운 15 분으로 반올림 한 동적 부울 속성을 만듭니다 (모델 당 부울 속성이 많음). 일주일에 한 번만 작동했지만 하루 동안 200 개의 색인 할당량을 초과했습니다. 목록 메서드의 문제는 목록의 30 개 요소로 제한된다는 것입니다. 왜냐하면 값이 기본적으로 백 엔드에서 별도의 쿼리로 OR 연산되기 때문입니다. 저는 사실 지금 당황스럽고 더 자세한 내용을 토론하고 싶습니다. – scottzer0

+0

어디에서 30 가지 요소 제한을 받고 있습니까? 한계는 엔티티 당 5000 개의 인덱싱 된 등록 정보이며 목록의 각 요소는 하나로 계산됩니다. 범위를 검색하는 경우 ([900,930,1000] IN 시간) 합병증이있을 수 있지만 목록에서 1 시간 검색하면 괜찮습니다 (930 시간). – dragonx

+0

아, 30 번으로 제한된 목록에있는 IN 필터와 관련하여 문서를 오해했습니다. 실제로는 다른 방향입니다. [link] (http://code.google.com/appengine/docs/python/datastore/datamodeling.html#Lists) – scottzer0

관련 문제