문제

응용 프로그램은 근접 검색을 어떻게 수행합니까? 예를 들어, 사용자는 우편 번호를 입력 한 다음 응용 프로그램은 근접성으로 주문한 20 마일 이내에 모든 비즈니스를 나열합니다.

PHP와 MySQL에서 그런 것을 만들고 싶습니다. 이 접근법이 정확합니까?

  1. 내가 관심있는 위치에 대한 주소를 얻고 내 데이터베이스에 저장
  2. Google의 지오 코딩 서비스를 사용하여 모든 주소를 지오 코드합니다
  3. 근접 검색 및 주문을 수행하기 위해 Haversine 공식이 포함 된 데이터베이스 쿼리 작성

이거 괜찮아? 3 단계에서는 모든 쿼리의 근접성을 계산하겠습니다. 모든 비즈니스와 몇 개의 참조 위치 사이의 거리를 나열하는 근접 테이블을 갖는 것이 더 낫습니까?

도움이 되었습니까?

해결책

속도에 대한 속도에 대한 레코드가 충분하면 미리 색인화 할 수있는 방법이 있습니다.

측면에서 약 20 마일의 쓰레기통을 정의하십시오. 각 상점의 레코드에 빈 번호를 저장하십시오. 검색 시간에 검색 지점에서 20 마일 반경을 교차하는 모든 빈의 수를 계산하십시오. 그런 다음 해당 쓰레기통의 모든 매장을 검색하고 이전과 같이 진행하십시오.

다른 팁

우리는 이것을 사용하여 수천 개의 포인트를 수행합니다. 위도 및 경도 열에 대한 색인을 갖기 위해 SQL 에서이 작업을 수행하는 경우 중요합니다. 우리는 공간 인덱스로 SQL 2008 에서이 작업을 시도했지만 실제로 예상 한 성능 증가를 보지 못했습니다. 지퍼에서 일정 거리 내에서 계산하려면 zip Centroid 또는 우편 번호의 다각형 표현을 사용할 것인지 생각해야합니다.

Haversine Forumla 시작하기에 좋은 곳입니다.

우리는 즉시 거리를 계산하는 성능 문제가 없었으며, 미리 포인트를 미리 알고 수백만의 레코드가있을 수있는 일부 애플리케이션에 대해 미리 계산합니다.

SELECT
        [DistanceRadius]=
        69.09 *
        DEGREES(
          ACOS(
            SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
           +
            COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
           *
            COS( RADIANS(longitude - (@ziplon)) )
          )
        )
        ,*
        FROM
            table

    ) sub
WHERE
    sub.DistanceRadius < @radius

우리는 약 1200 곳에이 작업을 수행합니다. 응용 프로그램에 따라 SQL 대신 PHP에 저장하는 것이 좋습니다. (우리의 구현은 .NET에 있으므로 마일리지가 다를 수 있습니다).

실제로 우리가 구현 한 방식에 대한 우리의 가장 큰 단점은 모든 계산 (최근까지)은 고통스럽게 느린 데이터 계층에 대해 계산되어야한다는 것입니다. ), 그러나 그것은 제공된 우편 번호를 기반으로 1200 개 지역의 거리를 계산해야했기 때문입니다.

선택한 경로에 따라 경도와 위도를보고 사전 정의 된 범위를 벗어나는 경도를보고, 예를 들어 20 마일 이내에 모든 주소를보고있는 경우에 숫자 거리 계산 속도를 높이는 방법이 있습니다. 경도 범위 모든 주소가 20 마일 떨어져야하는 모든 주소를 계산할 수 있습니다.) 필요한 경우 쿼리 속도를 높일 수 있습니다.

우리는 실제로 데이터베이스에 가능한 모든 조합을 저장하는 것을 보았습니다. 실제로 그것은 큰 데이터 저장소 일 수있는 것처럼 들리지만 실제로는 큰 범위에 있지 않습니다. 색인을 사용하면 매우 빠를 수 있으며 알고리즘 최적화 등에 대해 걱정할 필요가 없습니다. C#에 방정식이 있었기 때문에 우리는 이에 반대하여 결정했습니다. 비즈니스 계층. 어느 쪽이든 잘 작동 할 것입니다. 그것은 당신의 선호가 무엇인지에 대한 문제 일뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top