在mnesia中限制某个键下记录数的惯用方法是什么?

Chi*_*ang 5 erlang mnesia limit

我使用mnesia为用户存储数据,记录是一个结构像的包

{ username, field1, filed2, timestamp }
Run Code Online (Sandbox Code Playgroud)

为了不让数据库爆炸,我想对属于某个用户的记录数设置一个限制,比如说,如果一个用户的记录数达到500,那么在a之前删除时间戳最旧的记录插入新记录。

有没有一种有效的方法来做到这一点?

提前致谢。

Muz*_*hua 0

我提供了两种可能性。一种适合您的设计,另一种对您的记录定义进行微小的更改。查看哪一款最适合您的需求。下面的第一个在您的设计中工作。

-记录(用户,{用户名,字段1,字段2,时间戳})。

%% 在 mnesia 事务中执行以下函数

insert(#user{用户名 = U,时间戳 = _T} = 用户)->
    案例 mnesia:read({user,U}) of
        [] -> mnesia:write(用户);
        全部在这里->
            案例长度(AllHere) == 500 of
                false -> %% 还没有 500
                      mnesia:写(用户);
                正确->
                    %%值已达到500
                    %% 获取所有时间戳并获取
                    %% 最旧的记录并将其删除
                    %%
                    旧记录 = get_oldest_stamp(AllHere),
                    ok = mnesia:delete_object(记录),
                    mnesia:写(用户)
            结尾
    结尾。

get_oldest_stamp(用户记录)->
    %% 在这里进行排序
    %% 并返回记录
    %% 最旧的时间戳
    ....
    旧记录。


交易内的功能length/1并不是最优的。让我们想一个更好的办法。另外,我不知道你的时间戳是什么样子,所以我确信你有办法对它们进行排序并找出最新的时间戳,选出拥有该时间戳的记录,然后返回它。我给出这个解决方案只是为了适合您的设计。我也认为有些地方我们需要一些indexing。下一个实施对我来说似乎更好。如果我们可以更改记录定义并引入一个oldest采用 a 的字段bool()并像这样对其进行索引,会怎么样

-记录(用户,{
            用户名,
            字段1,
            字段2,
            时间戳,
            最旧的 %% bool(),已索引
})。
insert_user(用户名,字段1,字段2)-> 用户=#用户{ 用户名 = 用户名, 字段 1 = 字段 1, 字段2 = 字段2, 时间戳 = {日期(),时间()}
}。 插入(用户)。
%% 在 mnesia 事务中执行此操作
插入(#user{用户名= U} =用户)-> 案例 mnesia:read({user,U}) of [] -> mnesia:write(User#user{oldest = true}); 全部在这里-> 案例长度(AllHere) == 500 of 假-> %% 取消设置所有现有记录的最旧字段 %% 为假 F = 乐趣(用户X)-> 确定 = mnesia:delete_object(UserX), 确定 = mnesia:write(UserX#user{oldest = false}) 结尾, [F(XX) || XX <- 所有这里], 确定 = mnesia:write(User#user{oldest = true}); 正确-> [OldestRec] = mnesia:index_read(用户,true,oldest), ok = mnesia:delete_object(OldestRec), 确定 = mnesia:write(User#user{oldest = true}) 结尾 结尾。
上面的实现对我来说似乎更好。成功 !!