0

好的,所以我使用 API 来聚合一堆数据 - 举个例子,我们会说这些数据是关于园艺团体的。我最终想在一页上显示所有这些数据。

因此,首先,我可以搜索 agardener并获取有关他所在小组的一些信息。例如,如果我搜索Bob,我们将返回他在一个园艺小组中Lisa,其中TedGary、 和Jill

我可以对这些名称中的每一个进行进一步查询,以了解有关它们的更多信息。例如,我可以做一个tools查询,一个fruits查询,一个vegetables查询。

toolsBob 的查询示例可能会返回如下内容:

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

等等所有其他查询。基本上,每个查询都会返回最少量的信息来识别tools, fruits, vegetables每个园丁的不同之处。

我想要做的是将所有这些数据组合在一页上。因此,如果有人搜索 Bob,他们不仅会得到tools, fruits, and vegetables他的所有信息,还会得到他园艺小组中每个人的信息。这需要相当多的查询(使用 curl 到外部 API 提供程序完成)来获取所有这些信息,我现在想将这些信息呈现给正在查找的用户Bob

但是,我还想提供更详细的数据以及来自 API 的信息。例如,我有一个我想呈现给用户description的每个。tools, fruits, and vegetables因此,我可以使用 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

我现在正在做的是聚合所有查询的数据,然后从 MySQL 中为toolsfruitsvegetables.

类似的东西SELECT id, name, description FROM tools。然后我从结果集中创建一个对象以便于访问,形式为

$toolsSQL = 

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

例如,如果我目前正在为 Bob 的工具添加描述,我可以$toolsSQL[$toolID]['description']获取描述而不是mysqli_query(sprintf("SELECT description FROM tools WHERE id = '%d';", $toolID));

我对这种方法的问题是它会引入大量无关的数据,例如,Mongolian gardening oscillator在 MySQL 表中可能有一个名为 的工具,它永远不需要。但是,因为有很多重复,所以$toolsSQL[117]['description']多次调用比多次 mysqli 查询 更容易SELECT description FROM tools WHERE id = '117'(我认为 - 我不是 100% 确定我在这里所说的是否正确,但这是我天真的假设这种方式更快)。

我想补充的不仅仅是描述。但是,让我有点不安的是,我使用 SQL 查询一遍又一遍地获取相同的数据,尤其是始终相同的数据。似乎有一种更快的方法可以获取只需要通过SELECT语句访问的数据,但是我太新手了,不知道任何替代方案(或者我正在做的事情是否可以接受或首选)。这是否适用于 NoSQL 解决方案?对于那些真正阅读了这个巨大示例的人,我将不胜感激,感谢和赞扬:P。我希望我知道更多以便更直接地询问><

4

1 回答 1

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-description 对,我们可以像您所说的那样构造一个数组,但只使用使用过的工具,并且只有一个请求。通过对水果和蔬菜进行相同的操作,您可以通过总共 3 个 sql 请求获得所有必要的数据(并且只有必要的数据)。

如果您正在聚合的数据不经常更改,您还应该考虑缓存您的结果。这样,它会降低 API 和 MySQL 的使用率。以 APC 或 memcache 为例。

于 2013-07-05T10:19:22.763 回答