分辨多个用户之间是否是分身的算法?

106 天前
 Grocker

我有一个需求是为了分辨多个用户之间是否是分身(需求背景是为了防止新注册用户薅羊毛,优惠力度挺大的,是分身的用户只要一人享受了优惠,其他人不能再次享受), 所以我要将多个用户之间人为的去关联,比如用户 A 关联了 B ,A 和 B 互为分身;用户 B 再关联了 C ,B 和 C 互为 分身,C 和 A 也互为分身,因为有中间人 B ,以此类推,中间人的层级不限,这种用推荐使用什么算法实现呢?

我自己想到的是多存数据将这种层级平铺:

当用户 A 直接关联用户 B 时,我们在 associations 表中插入两条记录:

associations 表结构:user_id 关联用户 ID ,associated_user_id:被关联用户 ID ,is_direct:是否是直接关联

INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (A 的用户 ID, B 的用户 ID, TRUE);
INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (B 的用户 ID, A 的用户 ID, TRUE);

当用户 B 再直接关联用户 C 时,不仅插入 B 和 C 之间的直接关联记录,还插入 A 和 C 之间的间接关联记录:

INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (B 的用户 ID, C 的用户 ID, TRUE);
INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (C 的用户 ID, B 的用户 ID, TRUE);
INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (A 的用户 ID, C 的用户 ID, FALSE);
INSERT INTO associations (user_id, associated_user_id, is_direct) VALUES (C 的用户 ID, A 的用户 ID, FALSE);

需要用到的场景有: 取消关联某两个用户之间的关联 查询给定用户的所有分身

6451 次点击
所在节点    程序员
74 条回复
alphaControler
106 天前
@alphaControler 如果需要权重,那就搜带权并查集
null113
106 天前
并查集,求连通分支数,数据库的话就想办法生成一个唯一 id
xiangyuecn
106 天前
研究什么算法,直接一条一条查完事,查 100 次也不是什么事
MoYi123
106 天前
并查集的删除不太好做. 还是用 sql 的递归来实现 dfs 硬查吧, 看起来数据量不会很大.
snailya
106 天前
@hi909 我觉得你说的对
tianhehechu
106 天前
看了一圈,V 友们给出的方案要么太麻烦,要么达不到效果。用我这个方案就行了。
我的方案很简单,换个思路。不要去想着防止同一个人用多个账号登录,你要先假设系统中所有账号都是同一个人(未识别账号)。
接下来要做的就是从这些未识别账号中,识别出不是同一个人的。其余的一律提示:活动尚未对您开放。
如何识别出不是同一个人的账号呢,分事先预防和事后校验。
事先预防,就是注册账号时,用户名必须是有意义的字符串,只需要这一条,剩下的不需要。
事后校验,就是提现时要求输入信用卡号和 CVC 、校验人脸。信用卡信息不符、人脸校验不通过直接封 IP 、封设备指纹(并撤销同 IP 、同设备指纹所有用户的参与资格,已获得且未提现的归零,此操作只需把这些用户一并归入未识别用户)。未识别用户登录时,若此前已体现但资格被撤销,则要求从信用卡扣款返还费用方可继续使用。对于同一设备指纹的其他用户,也作相同提示:该设备中有欺诈用户尚未返还非法所得,已禁止当前设备所有用户使用,返还非法所得后将解除限制。
Grocker
106 天前
@hi909 我觉得这种也是最简便的,比如 A 关联 B ,group 是 1 ,B 关联 C ,查询到他有 customer group 了,把它也放在 group 1 就行了
dyllen
106 天前
你这个数据库设计相当于把账号关联穷举存在了数据库。删除两个数据,需要把直接或者间接的也全找出来删掉,这那里是什么算法,分明是个数据库设计和查询问题,照你这设计穷举写入,删除也穷举查询呗。
Grocker
106 天前
@dyllen 如果数据库设计能满足场景,那他就是个数据库设计和查询问题,如果设计的不满足,就演变成算法问题了 😄
clf
106 天前
都是线下了,做成发码的机制呗。业务员发码,一个 手机设备识别号 或 实名信息 只能使用一次。

额外的需要线下登记宝宝的身份证号,只允许登记 XX 周岁以下的身份证信息

但这种反正就是无法避免业务员和客户之间勾结
allenpu666
106 天前
@Grocker #6 这种建议不要去重。
如果爸爸重新注册了一个账号都不能享受优惠的话,那拉新的数据可能非常难看。
到时候你就会发现,没有真正的“新人”

20 年那会,斑马等一众平台的推销人员还让孩子妈妈换一个手机号注册,这样就能享受到优惠呢。
yisheyuanzhang
106 天前
@Grocker 如果有两个孩子,爸爸给哥哥注册、妈妈给妹妹注册算不算新用户。。
Grocker
106 天前
@yisheyuanzhang 算不算全凭这个孩子在不在被关联的这个池子里
flyqie
106 天前
防止新注册用户薅羊毛

你这边业务是推广期还是?

推广期的话你这种玩法拉新会非常难看。

不是的话,最好的方法就是以孩子唯一 ID 做一个组,这样会非常省事,不要想用互关这种方式来做,互关这场景做起来麻烦事一堆。
flyqie
106 天前
@flyqie #34

如果有多个孩子的话,也可以考虑以家庭为唯一 ID 做组。
Grocker
106 天前
@flyqie 业务已经是成熟期了

我们的注册模式是一个手机号可以注册一个用户,一个用户最多可以添加三个孩子
实际登录的实体是孩子
如果一个孩子被认为是分身,那么这个用户下的所有孩子都会被认为是分身

你说的 以孩子唯一 ID 做一个组是什么意思?
icloudguizhou
106 天前
@TArysiyehua Uber eats 新用户 refer 有 55 美金大羊毛设备刷机+新的信用卡就能随便薅,没有强制上传 ID
Grocker
106 天前
@Grocker 去除 “如果一个孩子被认为是分身,那么这个用户下的所有孩子都会被认为是分身”
yankebupt
106 天前
@Grocker is_premium_user 字段存储最先注册的用户
其他关联用户全部用 referrer 字段存储关联 premium 用户的 id

当然关联关系获知时要给一点小利比如小优惠避免逃避检测,比如拼多多就放了个砍一刀陷阱,其实就是要手机指纹家庭关系关联数据库。

每个新优惠到达时全部按 referrer 递归层层上溯并存储在 premium user 的优惠记录中,但是使用权记在自己的记录中。然后所有人申请优惠时按 referrer 查找 premium user 是否享受过优惠即可。
wweerrgtc
106 天前
没用的, 一个黄牛 带着 100 人的黄牛群

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1060831

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX