我遇到了客户端的数据库问题,如果有人可以帮助我,那就徘徊。我目前正在尝试实现过滤功能,以便用户可以在搜索结果后过滤结果。我们正在使用SQL Server 2008.我正在开发电子电子商务网站,数据库非常庞大(500,000多条记录)。场景是这样的 - 用户访问我们的网站并键入“笔记本电脑”并点击搜索。这将带来数千个结果的第一页。那我想做的是 进一步过滤这些结果,并向用户显示以下选项:
黑色(7000)
银(2000)
数据库的主要列是这样的 - 主键是整数ID
ID标题制造商颜色
问题的关键部分是如何以有效的方式获得各种类别的计数。我目前知道如何做的唯一方法是使用单独的查询。但是,如果我们希望按其他类别进行过滤,那么这将变得非常慢 - 特别是随着数据库的增长。我目前的SQL是:
select count(*) as ManufacturerCount, Manufacturer from [ProductDB.Product] GROUP BY Manufacturer;
select count(*) as ColourCount, Colour from [ProductDB.Product] GROUP BY Colour;
我的问题是,如果我可以使用某种连接或联合将结果作为单个表获取,并且这比我使用Count(*)函数发出多个查询的当前方法更快。感谢您的帮助,如果您需要任何进一步的信息,请询问。 PS我在ebay和亚马逊这样的网站上徘徊如何快速地做到这一点。为了更好地了解我的问题,如果你去ebay并输入笔记本电脑,你会的 看到左边的一些过滤器 - 这基本上就是我想要实现的。当有很多过滤器时,我不知道如何有效地完成它。例如,要获得与Ebay相同的功能,我需要大约10个查询,我相信这会很慢。我正在考虑创建一个包含所有计数的中间表,但是必须不断更新中间表以反映数据库的更改,如果每分钟有多个更新,那将是一个问题。感谢。
答案 0 :(得分:0)
“中间表”正是要走的路。我可以向您保证,在每次查询时,没有具有大量流量和大量产品的电子商务网站都会按照您的建议进行操作。
如果您担心跟踪产品的变化,只需通过存储过程(我的首选方法)对产品目录进行所有更改,或者使用触发器。
一个复杂因素是如何在中间表中对事物进行分组。如果您只对产品层次结构中内置的预定义类别和子类别进行分组,那么它非常简单。听起来你正在允许自由文本搜索......如果是这样,你将如何管理导致不同类别意外交叉的多个关键字?一种方法是保存搜索的关键字以及计数和时间戳。然后,下次有人搜索相同的关键字时,检查中间表以及时间戳是否早于某个预定阈值(例如,5分钟),将结果返回到临时表,从临时表中查询类别计数,使用新的时间戳覆盖以前的计数,并将整个辣酱玉米饼馅返回到Web应用程序。否则,跳过临时表,只返回预先聚合的计数和数据记录。在这种情况下,你可能会得到一些古怪的前端计数行为,就像在特定类别中可能会说“10个结果”,但是当用户向下钻取时,他们实际上找到了9或11.我在不同的网站上发生了这样的事情。顾客,这真的不是什么大不了的事。
顺便说一下,我曾经为一家知名的电子商务公司工作,我们做过这样的事情。