好的,所以我使用API来聚合大量数据 - 为了举个例子,我们会说数据是关于园艺组的。我最终想在一个页面上显示所有这些数据。
首先,我可以搜索gardener
并获取有关他所在群组的一些信息。例如,如果我搜索Bob
,我们会回复他所在包含Lisa
,Ted
,Gary
和Jill
的园艺小组。
我可以对这些名称进行进一步查询,以了解有关它们的更多信息。例如,我可以执行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.
所以这就是问题,当我得到tools
,fruits
和vegetables
的结果时,会有很多重复的数据。园丁将拥有许多相同的工具,他们将种植许多相同类型的水果和蔬菜。
我现在正在做的是聚合所有查询的数据,然后从MySQL中提取表tools
,fruits
和vegetables
。
像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。我希望我知道更多,以便更直接地询问><
答案 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为例。