2017-11-20 3 views
0

현재 Laravel과 Postgres (확장 Postgis 포함)를 사용하고 있습니다.1500 개 항목의 열을 그 자체로 곱하는 가장 좋은 방법은 무엇입니까?

1500 개의 다른 위치로 경로를 생성하고 싶습니다.

1500을 곱한 1500은 2.250.000입니다 (생성하려는 경로 수에서 동일한 위치를 뺀 값).

그래서 제 질문은 :

1)을 할 수있는 가장 좋은 방법은 무엇입니까? (2.250.000을 만들면 서버에 스트레스가 발생합니다.)

2) 새 위치를 추가하려면 어떻게해야합니까? (이전에 추가 된 위치로 페어를 업데이트해야하기 때문에).

3) 이것은 당신이 순진하게 그것을 전체 결과 집합을 생성 할 경우이 루트 사이에 자체 조인되는 동일한 이름 (베를린, 베를린 등)

+2

그냥 생각할 수있는 모든 가능성에 대한 경로를 만들 필요가 결정 궁금해? 루트를 읽어야합니다. – TimBrownlaw

+0

@TimBrownlaw 질문에 감사드립니다. 내가 일하는 택시 서비스는 가격에 킬로미터를 곱하면 안된다. 80x80 위치와 킬로미터에 가격을 곱한 정적 가격이 필요하다. –

+0

@TimBrownlaw 그리고 OSRM, Google Maps 및 Mapbox 패키지를 만들기로 결정했다. 사용자. –

답변

0

와 쌍을 제거합니다. 이를 수행하는 가장 좋은 방법은 실제로 결과로 무엇을하고 싶은지에 달려 있습니다.

특정 출발지 및 목적지에 따라 요금이 부과되는 요금이 부과 될 수 있습니다. 적하 목록을 각 위치와 연관시킬 수있는 출발지와 목적지의 고정 된 적하 목록으로 (원점, 목적지) 플래그 가을 가격을 분리 할 수 ​​있습니까? 그렇다면 가격을 계산하기 위해 전체 테이블 간 산물을 질의 할 필요가 없습니다.

로딩 패턴을 그런 식으로 분리 할 수없는 경우 이러한 플래그 가을 가격이 교차 간거리 매트릭스에 어떻게로드됩니까? 이 가격 책정에 대한 데이터 소스가 이미 있어야합니다.

복제본을 제거하고 (X에서 Y로), (Y에서 X로)와 같은 경로 쌍을 생성하려면 상호 제품을 생성하려면 위치 간 비교를 "엄격하게 미만"으로 사용하고 싶습니다 , 이것은 역방향 경로와 자체 경로를 자연스럽게 제거합니다. 또는 자체 경로를 제거하고 역 경로를 유지하기 위해 불평등 테스트를 대신 사용할 수 있습니다. 적합 WHERE 절 예제가 있습니다
https://en.wikipedia.org/wiki/Join_(SQL)#Self-join

+0

지난 번에 id를 사용하고 foreach 루프를 수행 했으므로 (베를린은 1이고 베른은 2) 예를 들어, 가격 모델. 예를 들어, 위치 ID 1 name Berlin, 위치 ID 2 name Bern. 경로 ID 1 from_id 1 to_id 2. 가격 ID 1, route_id 1 가격 200 –

+0

여기에서 문제는 SQL을 수행하는 동안 거리를 가져 오는 기능을 사용하는 것입니다. –

+0

그러나 그것은 방법입니다. 나는 그것을 내일 시도 할 것이다, 아마 나는 새로운 테이블에 거리를 저장할 것이다. –

0

가 삽입 할 정확히 모른 채, 희망이 방법은 당신을 위해 작동합니다

public function insert_locations($locations, $new_locations) { 

    // make them into collection if not already 
    $locations_coll = Collection::make($locations); 

    // chunk the database insert if there are too many records in the collection 
    $locations_coll->chunk(500)->each(function($chunk1) { 

     $inserts = ''; 
     // loop through locations 
     foreach($chunk1 as $location1) { 

      foreach($new_locations as $location2) { 

       // if locations are the same then skip 
       if($location1==$location2) continue; 

       // add to bulk inserts 
       $inserts .= '(' . $location1 . '-' . $location2 . '), ' . PHP_EOL; 
      } 

     } 

     // do the bulk insert 
     try { 
      DB::insert("INSERT INTO your_table (`locations`) VALUES $inserts"); 
     } catch (Exception $e) { 
      print_r([$e->getMessage()]); 
     } 
    }); 
} 

// get your existing locations 
$locations = ['Berlin', 'Hamburg', 'Stuttgart', 'Hannover', 'Heidelberg', 'Bern' ...]; 

// and get your new locations 
$new_locations = ['Berlin', 'Hamburg', 'Stuttgart', 'Hannover', 'Heidelberg', 'Bern' ...]; 

// call the method 
insert_locations($locations, $new_locations); 

// get more new locations 
$new_locations = ['Bayern']; 

// call the method again 
insert_locations($locations, $new_locations); 

당신이 삽입 중복 당신이 뭔가를 사용할 수를 피하려면 귀하의 SQL 문을 이렇게 :

DB::insert("INSERT INTO your_table (`locations`) VALUES $inserts ON DUPLICATE KEY UPDATE `locations`=VALUES(`locations`)"); 
+0

새로운 위치를 추가하면 문제가 생깁니 까? 예를 들어 Bayern을 It에 추가합니다. –

+0

나는이 문제를 해결하기 위해 내 대답을 업데이트했다. 나는 네가 필요로하는 것을 이해하지 못할 수도있다. – CUGreen