自动为用户生成唯一昵称

Generate unique nickname for user automatically

我需要生成唯一的昵称,其中包含用户的名字和一些预定义形容词的随机词。由于用户的名字和形容词的非唯一组合,可能会发生冲突。如何避免碰撞?我想在生成的序列中添加增量后缀,例如 amused-alexamused-alex-1amused-alex-2、...、amused-alex-n.

我的想法是创建额外的 table 包含所有已使用的名称:

nickname count
amused-alex 2
bionic-john 1

所以 amused-alex 的下一次碰撞会有像 amused-alex-3 这样的昵称。或许有一些更优化的方案来解决此类问题?

我相信您只需要一个 serial 列就可以对昵称别名进行排序。

示例:

create table users_test(nickname varchar,nick_id serial);
insert into users_test values ('amused-alex');
insert into users_test values ('amused-alex');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');
insert into users_test values ('good-joe');

现在 users_test 包含五行

  nickname   | nick_id 
-------------+---------
 amused-alex |       1
 amused-alex |       2
 good-joe    |       3
 good-joe    |       4
 good-joe    |       5
(5 rows)

通过以下查询,您可以生成始终不同的昵称。

select nickname, nick_id, nickname ||'-' ||rank() over (partition by nickname order by nick_id asc) nickname_unique from users_test;
  nickname   | nick_id | nickname_unique 
-------------+---------+-----------------
 amused-alex |       1 | amused-alex-1
 amused-alex |       2 | amused-alex-2
 good-joe    |       3 | good-joe-1
 good-joe    |       4 | good-joe-2
 good-joe    |       5 | good-joe-3
(5 rows)

查询正在 nick_id 序列列上使用 RANK 函数。这样可以确保永远不会发生碰撞。