我有用户输入一些数据,每次他们这样做,他们也输入一个关键字。一。现在我想要的是存储他们输入的最后一个 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
列来存储队列的头部,但是我需要再次进行选择+更新以使其工作。
还有其他(可能更好)的方法吗?
我当然希望避免重复,如果可能的话,尽可能制作现有的(当需要插入重复时)最近......
答案 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只存储以令牌分隔的关键字列表的文本表示。