2013-07-05 2 views
0

좋아요, 그래서 API를 사용하여 많은 데이터를 집계합니다. 예를 들어 데이터가 원예 그룹에 관한 것입니다. 결국이 모든 데이터를 한 페이지에 표시하려고합니다.대용량의 반복 데이터를 사용자에게 제공하는 방법

그래서 밖으로 시작, 나는 gardener 검색하고 그가에서의 그룹에 대한 정보를 다시 얻을 수 있습니다. 예를 들어, 내가 Bob을 검색하는 경우, 우리는 TedLisa와 원예 그룹에 그가 있다는 연락 드리겠습니다 , GaryJill.

각 이름에 대해 더 많은 질문을 할 수 있습니다. 예를 들어 tools 쿼리 인 fruits 쿼리와 vegetables 쿼리를 수행 할 수 있습니다.

밥위한 tools 쿼리의 예는 다음과 같이 뭔가를 반환 할 수 있습니다 :

tools: [ 
     { 
      Id: 117, 
      name: "Rake" 
     }, 
     { 
      Id: 175, 
      name: "Shovel" 
     }, 
     { 
      Id: 55, 
      name: "Hoe" 
     }, 
     { 
      Id: 270, 
      name: "Wheelbarrow" 
     } 
     ] 

등을 다른 모든 쿼리. 기본적으로 각 쿼리는 각 정원사에 대해 다른 tools, fruits, vegetables을 식별하는 데 필요한 최소한의 정보를 반환합니다.

내가 원하는 것은이 모든 데이터를 한 페이지에 결합하는 것입니다. 그래서 누군가 밥을 검색하면 그 사람도 모두 tools, fruits, and vegetables을 얻게 될뿐만 아니라, 자신의 원예 그룹에있는 모든 사람들을위한 정보도 얻게됩니다. 이것은 꽤 많은 쿼리를 필요로합니다 (외부 API 공급자에게 컬을 사용하여 완료). 그 정보를 모두 얻으려고합니다. 사용자에게 보려는 정보는 Bob입니다.

그러나 API의 정보와 함께 더 자세한 데이터를 제시하고자합니다. 예를 들어 사용자에게 선물하려는 tools, fruits, and vegetables 각각에 대해 description이 있습니다. 그래서 그 대신 난 그냥에 대한 API를 사용할 수있는이 같은의 :

User enters 'Bob' 

My site returns: 

The other members of Bob's gardening group are Lisa, Ted, Gary, and Jill. 

Bob's stats: 
Bob uses the following tools: a rake, shovel, hoe, and wheelbarrow. 
Bob is growing the following fruits: strawberries and blueberries. 
Bob is growing the following vegetables: carrots, radishes, and potatoes. 

Lisa's stats: 
Lisa uses the following tools: gardening gloves, a shovel, and a rake. 
etc. 

내가 설명 (더 많은 정보를 포함하고 이런 일을하려면,이 외부 정보를 끌어와 통합의 단지 예입니다 API 결과와 함께). 현재 기술 데이터는 MySQL의 테이블에 저장됩니다

User enters 'Bob' 

My site returns: 

The other members of Bob's gardening group are Lisa, Ted, Gary, and Jill. 

Bob's stats: 
    Bob's tools: 
    Rake - Used to loosen soil and remove weeds 
    Shovel - Used to remove soil 
    Wheelbarrow - Used to transport large loads 
    Hoe - Used to move small amounts of soil 
    Bob's fruits: 
    Blueberries - A small, sweet berry full of antioxidants. 

    etc. 

Lisa's stats: 
    Lisa's tools: 
     Rake - Used to loosen soil and remove weeds 
     Shovel - Used to remove soil 
     Gardening gloves - Used to protect hands 
    etc. 

그래서 여기에서 나는 tools, fruitsvegetables의 결과를 얻을 때, 중복 데이터를 많이있을거야, 문제가 자리 잡고 있습니다. 정원사들은 똑같은 도구를 많이 갖게 될 것이고 똑같은 종류의 과일과 채소를 심을 것입니다.

쿼리 한 모든 데이터를 집계 한 다음 tools, fruitsvegetables에 대한 테이블을 MySQL에서 가져옵니다.

같은 것을 SELECT id, name, description FROM tools과 같은 것입니다. 나는 현재 밥의 도구에 대한 설명에 추가 해요 만약 그때 내가 대신의 설명에서 얻을 수 $toolsSQL[$toolID]['description']을 할 수있는, 예를 들어

$toolsSQL = 

117 => 
    { 
     id: 117, 
     name: "Rake", 
     description: "Used to loosen soil and remove weeds" 
    } 
55 => 
    etc. 

의 형태로 쉽게 액세스 할 결과 세트에서 객체를 만들 mysqli_query(sprintf("SELECT description FROM tools WHERE id = '%d';", $toolID));

이 접근 방식의 문제점은 필자가 결코 필요없는 MySQL 테이블에 Mongolian gardening oscillator이라는 이름의 도구가있을 수있는 등 많은 양의 불필요한 데이터를 가져 오는 것입니다.그러나 반복 횟수가 많기 때문에 SELECT description FROM tools WHERE id = '117'의 여러 mysqli 쿼리보다 여러 번 $toolsSQL[117]['description']을 호출하는 것이 더 쉽습니다. (내가 생각하는 바가 여기에 맞으면 100 % 확신 할 수는 없지만 내 순진함은 확실합니다. 이 방법이 더 빠르다고 가정).

내가 추가하고 싶은 것은 단순한 설명 이상의 의미입니다. 그러나, 그것은 내가 동일한 데이터를 반복해서 얻기 위해 SQL 쿼리를 사용한다는 것을 조금 불안하게 만듭니다. 특히 항상 동일한 데이터입니다. SELECT 문으로 액세스해야하는 데이터를 얻는 데 훨씬 빠른 방법이있는 것 같지만 어떤 대안을 알기에는 너무 초보자입니다 (또는 내가하는 일이 허용되는지 또는 선호). NoSQL 솔루션으로 제대로 작동 할 수 있습니까? 나는이 거대한 모범을 실제로 읽은 당신들에게 어떤 도움, 감사와 명성에 감사 할 것입니다 : P. 좀 더 직접적으로 묻기 위해 더 많이 알고 싶습니다.> <

+0

어떤 종류의 API입니까? – Raptor

답변

1

SQL 데이터베이스에 대한 쿼리 수를 제한하려면 여러 요청을 하나로 그룹화하는 것이 좋습니다. 예 :

/* I'm supposing that $gardeners looks like that : 
* { 
* bob : { 
*  tools: [{Id: 117,name: "Rake"}, {Id: 175,name: "Shovel"},[...]], 
*  fruits : [...] 
* }, 
* Lisa : {tools: [...]} 
* } 
*/ 
$toolIDs = array(); 
foreach ($gardeners as $gardener) { 
    foreach ($gardener->tools as $tool) { 
    $toolIDs[] = $tool->Id; // get Ids of all used tools 
    } 
} 
$toolIDs = array_unique($toolIDs); // remove duplicate Ids 

// fetch the description of all the used tools in one go 
$result = mysqli_query(sprintf("SELECT id, description FROM tools WHERE id IN ('%d');", implode("','", $toolID))); 

우리는 ID-설명 커플을 가지고 있기 때문에, 우리는 당신에 대해 얘기했다 것과 같은 배열을 구성,하지만 사용 된 도구, 단 하나 개의 요청 할 수 있습니다. 과일 및 채소와 동일한 작업을 수행하면 총 3 개의 SQL 요청으로 필요한 모든 데이터 (필요한 데이터 만)를 얻을 수 있습니다.

집계중인 데이터가 자주 변경되지 않으면 결과를 캐싱해야합니다. 그렇게하면 API와 MySQL 모두 사용량이 줄어 듭니다. 예를 들어 APC ou memcache를 살펴보십시오.

관련 문제