在SQL中实现循环列表式结构

时间:2014-03-27 00:32:10

标签: sql-server tsql circular-list

我有用户输入一些数据,每次他们这样做,他们也输入一个关键字。一。现在我想要的是存储他们输入的最后一个 N 关键字,因为它们似乎往往更频繁地输入常规的几个。

我可以创建一个SQL表来存储这些

create table UserKeywordsUsed (
    UserId int not null references...,
    Keyword nvarchar(50) not null,
    CreatedOn datetime not null default getdate()
)

但是这个表会有很多数据及时。我可以删除过时的记录,但是我想把它作为一个小表来实现,它不会随着时间的推移而增长,而是与用户一起成长。

另一种可能性是拥有这种表

create table UserKeywordsUsed (
    UserId int not null references...,
    Keyword1 nvarchar(50) not null,
    Keyword2 nvarchar(50) not null,
    ...
    KeywordN nvarchar(50) not null
)

但我真的不知道如何实现更新此表的正确列。我可以添加一个额外的tinyint列来存储队列的头部,但是我需要再次进行选择+更新以使其工作。

还有其他(可能更好)的方法吗?

修改

我当然希望避免重复,如果可能的话,尽可能制作现有的(当需要插入重复时)最近......

1 个答案:

答案 0 :(得分:0)

宽表方法

感觉有点笨拙,可能效率不高,但您可以更新更新中的所有列,例如。

UPDATE userkeywords SET key3=key2, key2=key1, key1=? where userid=?

从效率的角度来看,您可能想要考虑数据类型(可能需要考虑CHAR over VARCHAR,因为您可能不需要调整某些行的大小)。

多行方法

您可以简单地对表中最旧的记录发布更新,例如(我认为这是正确的SQL服务器TOP语法,但TSQL是我最不为人知的方言):

update UserKeyWordsUsed set keyword=?
 where userid=?
   and CreatedOn = (SELECT TOP 1 CreatedOn
                      FROM UserKeyWordsUsed
                     WHERE userId= ?
                  ORDER BY CreatedOn);

在这种情况下,您可能希望在创建用户或创建更新前执行预检检查时创建10条记录。

您还可以使用插入后触发器删除旧记录,但如果您只是通过更新处理它似乎会更简单。

根据您的使用情况,您还可以将其移至应用程序层,并让DB只存储以令牌分隔的关键字列表的文本表示。