如何向用户呈现大量重复数据

时间:2013-07-05 07:40:08

标签: php mysql api select nosql

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

首先,我可以搜索gardener并获取有关他所在群组的一些信息。例如,如果我搜索Bob,我们会回复他所在包含LisaTedGaryJill的园艺小组。

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

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

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.

所以这就是问题,当我得到toolsfruitsvegetables的结果时,会有很多重复的数据。园丁将拥有许多相同的工具,他们将种植许多相同类型的水果和蔬菜。

我现在正在做的是聚合所有查询的数据,然后从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));

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

我想要添加的内容不仅仅是描述。但是,让我有点不安的是,我正在使用SQL查询来反复获取相同的数据,特别是数据总是相同的。似乎可能有更快的方式来获取只需要SELECT语句访问的数据,但我不知道任何替代方案(或者我是不是做是可以接受的或者首选的)。这是否适用于NoSQL解决方案?对于那些真正阅读过这个巨大例子的人,我将不胜感激,感谢和赞赏:P。我希望我知道更多,以便更直接地询问><

1 个答案:

答案 0 :(得分: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 ou memcache为例。