将最后的“x”结果保存在数据库中
Posted
技术标签:
【中文标题】将最后的“x”结果保存在数据库中【英文标题】:Keep the last 'x' results in a database 【发布时间】:2015-06-16 11:16:27 【问题描述】:我想问一下是否有一种快速方法可以将最后插入的“x”行保留在数据库中。
例如,我有一个应用程序,用户可以通过该应用程序搜索项目,我想保留每个用户最近进行的 10 次搜索。我不想将他的所有搜索都保存到数据库中,因为这会增加 db_size。有没有一种快速的方法可以在我的数据库上只保留最近的 10 次搜索,或者我应该每次都检查一下:
A) 到目前为止,数据库中存储了多少搜索 B) if (searches = 10) 删除最后一行 C) 插入新行
我认为这种方式会对性能产生影响,因为它需要对数据库进行 3 种不同的访问:检查、删除和插入
【问题讨论】:
什么数据库?如果它支持存储过程,那么您可以在一次调用中轻松完成所有这些工作。您也可以在一个呼叫中临时执行此操作,但这有点麻烦。 1.一次有多少用户运行您的应用程序? 2.我认为您可以通过用新行更新以前的行来插入这些行(您可以在插入行时添加时间戳,以了解哪一行是最旧的行)。 使用环形缓冲区 - 最多保存 10 次搜索并保持“指针”指向最后一次。 @StuartAinsworth 数据库是 H2 @Arvo 有没有关于如何使用环形缓冲区的例子? 【参考方案1】:我认为这不是一种简单/快速的方法。根据您的条件,我创建了以下存储过程。
我考虑过SearchContent
,它将存储数据。
CREATE TABLE SearchContent (
Id INT IDENTITY (1, 1),
UserId VARCHAR (8),
SearchedOn DATETIME,
Keyword VARCHAR (40)
)
在存储过程中传递UserId, Keyword
并进行计算。该程序将是,
CREATE PROCEDURE [dbo].[pub_SaveSearchDetails]
(
@UserId VARCHAR (8),
@Keyword VARCHAR (40)
)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Count AS INT = 0;
-- A) how many searches has been stored on database so far
SELECT @Count = COUNT(Keyword) FROM SearchContent WHERE UserId = @UserId
IF @Count >= 10
BEGIN
-- B) if (searches = 10) delete last row
DELETE FROM SearchContent WHERE Id IN ( SELECT TOP 1 Id FROM SearchContent WHERE UserId = @UserId ORDER BY SearchedOn ASC)
END
-- C) insert new row
INSERT INTO SearchContent (UserId, SearchedOn, Keyword)
VALUES (@UserId, GETDATE(), @Keyword)
END
示例执行:EXEC pub_SaveSearchDetails 'A001', 'angularjs'
【讨论】:
我猜你在这里引用 MSSQL 数据库。所以这不能应用于 H2 数据库以上是关于将最后的“x”结果保存在数据库中的主要内容,如果未能解决你的问题,请参考以下文章
C# 将“X”次保存到一个 .txt 文件中而不覆盖最后一个字符串