将最后的“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”结果保存在数据库中的主要内容,如果未能解决你的问题,请参考以下文章

matlab如何将运行的结果保存在txt中?

C# 将“X”次保存到一个 .txt 文件中而不覆盖最后一个字符串

matlab 怎么批量保存数据

多处理池的python保存数据在linux上没有给出预期的结果

如何将查询结果保存到单独的表中?

匹配 csv 文件中的文本,用于 X 首行和最后 X 个结果,并在 lua 中获取值