문제

제가 건축 한 사이트가 있습니다. 몇 가지 사용자 기본 설정을 기반으로 메일 병합 (다소 ...)을 생성하는 응용 프로그램입니다. 그것은 문제없이 직교로 조인 데이터를 생성 할 수 있지만, 삶을 조금 더 어렵게 만들기 위해서는 기업의 요구가 있습니다 ...

원격 직원의 우편 번호를 확인한 후 미디어 대상의 직원과 얼마나 멀리 떨어져 있는지에 따라 미디어 대상에 이메일을 생성하도록 응용 프로그램을 구축해야합니다. 예를 들어 직원이 일하는 곳에서 잘 알려진 자원 봉사자라고 가정 해 봅시다. 기업은 직원이 직원이하는 작업에 대한 메시지를 5 마일 이내에 미디어로 이메일로 보내려고합니다. 이것은 상황이 지저분 해지는 곳입니다 ... 여기에 몇 가지 선택이 있습니다. 시도와 실패를 간략하게 설명합니다.

  1. 가장 큰 반경은 20 마일입니다. 미국의 모든 우편 번호의 레코드를 보유한 데이터베이스 테이블을 만듭니다. 해당 우편 번호의 20 마일 이내에 모든 우편 번호에 결합됩니다. 데이터 세트는 같은 것 같습니다 (이름은 다르고 인수를위한 것입니다) :
    Sourcezip] | [City] | [State] | [CloseZip] | [City] | [State] | [거리
    실패 : 예를 들어, NY는 위의 데이터 세트에서 350k 레코드를 가지고 있습니다 (및 다른 상태는 더 나쁩니다!). 해당 페이지의 평균로드 시간? 6 분 ... 일어나지 않습니다. 브레이크 포인트를 설정하여 이것을 확인했습니다. DataAdapter.fill () 단계에서 연결이 끊김이 발생합니다.

  2. (이것은 물류 문제로 인해 구현되지 않았습니다.) 각 직원의 ZIP에 x 이하의 거리를 대상으로 ZIP에 데이터베이스 연결을합니다. 소스 파일과 미디어 대상이 결합 된 것을 제외하고는 34K 이상의 개별 이메일에 도달 할 수 있습니다. 34K DB 연결? 우편 번호 검색을 재사용하는 방법을 고안하더라도 DB에서 테스트 점검을 수행 한 결과 NY에는 직원이 일한 곳에서 500 개의 별개의 우편 번호가 있음을 발견했습니다. 500 DB 연결? 나는 그것이 효과가 있을지 의심하지만 놀랄 수 있습니다.

  3. 문제를 해결하기위한 최신 체계는 웹 서버가 새로운 데이터 세트를 얻음으로써 .NET 데이터 세트 객체보다 더 나은 게임을 실행하기를 희망한다는 것입니다.
    zip] | [경도] | [위도
    그런 다음 데이터가 작동하는지 파악하기 위해 거리 공식을 수행합니다. 이것은 웹 서버의 프로세서에 크게 의존합니다. 이것은 가치있는 도박입니까, 아니면이 시도에서도 동일한로드 타임 손상을 찾을 수 있습니까?

    더 좋은 방법이 있습니까?

    이 프로젝트 가이 프로젝트에 대한 두려움을 확인하더라도 어떤 입력도 감사합니다. 작동하지 않을 수도 있습니다.

추가 메모: 서버를 제어하지 않고 SQL2K를 실행하고 있습니다.

도움이 되었습니까?

해결책

직원을위한 데이터 세트와 미디어를위한 데이터 세트가 있고 거리의 거리에 대한 세 번째 데이터 세트가있는 경우 3 개의 테이블을 함께 결합하는 데 약간의 시간을 절약 할 수 있습니다 ...

SELECT *
FROM Employees_List
   INNER JOIN 
       (Media_List INNER JOIN Distance_List ON Media_List.Zip = Distance_List.Target_Zip)
   ON Employees_List.Zip = Distance_List.Source_Zip
WHERE distance_Miles <=5

이렇게하면 거리를 사용하여 직원과 미디어 간의 관계를 설정합니다.

다른 팁

경도/위도 좌표가있는 우편 번호 데이터베이스가있는 경우 내 haversine 기능으로 즉시 거리를 계산할 수 있습니다 (내 참조 이 질문에 대한 답변).

이것은 전체 미국 우편 번호 데이터와 함께 웹 앱에서 매우 잘 수행됩니다.

쿼리는 다음과 비슷한 것처럼 보입니다.

select * from zip where 
   dbo.udf_Haversine(zip.lat,zip.long, @lat, @lon) < 20   -- (miles)

이를 각 수신자의 주소에 적용하지는 않지만 먼저 반경 내의 우편 번호 (중첩 쿼리 또는 CTE)를 결정한 다음 메일을 보내는 데 필요한 모든 주소에 가입합니다.

편집하다 조사 후 Haversine 기능에 대한 답변은 내가 취할 경로입니다 ... DB가 사용하는 기능만큼 집중적이지 않습니다 (수정 될 것입니다 :)).

당신은해야합니다 ~ 아니다 매번 거리를 계산하면 Long/Lat에서 Long/Lat까지의 큰 계산이며, 두 번 이상 수행하는 경우 불필요합니다.

즉, 왜 옵션 #2를 썼는지 확실하지 않습니다. 우리는 실제로 이와 비슷한 일을하고 있습니다. 어쩌면 나는 숫자에 혼란 스러울 수도 있지만, 당신이 언급 한 것은 SQL2K가 땀을 흘리기위한 것이 아닙니다.

미국에서 우편에서 지퍼까지의 거리를 오프라인으로 계산하더라도 ~ 20 억 행만 있습니다. 그렇습니다. 많은 것이지만, 정적으로는 정적이며 느리게하면 샤드가 될 수 있습니다. 등.

MySQL에서 SourceZip (Alter Table .. Order By (sourcezip))로 테이블 및 색인을 주문하는 경우 350k 행 (NY의 예제)을 선택하면 6 분이 소요되지 않습니다. 1 초만 걸리면됩니다 ... 변경 시간은 오랜 시간이 걸립니다 (또는 그 순서대로 테이블을 만들 수 있음). 그러나 정적 테이블이기 때문에 아무런 가치가 없습니다.

SQL 2008을 사용하고 있습니까? 그렇다면 새로운 공간 데이터 기능이 여기에서 찾고있는 것일 수 있습니다. 문자열에 대한 "같은"비교를 사용하는 것만 큼 쉽게 다른 범위 내에서 좌표를 찾을 수 있습니다.

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

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