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

2024-07-29 11:34:35 +08:00
 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);

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

8548 次点击
所在节点    程序员
74 条回复
lchynn
2024-07-30 09:42:41 +08:00
或者一本产证最多允许 2 个未满 18 岁身份证号的优惠 (未满 18 岁也有身份证,户口本上有);

按产证拿福利,思路来自于魔都大封城期间,居委发每户“救济粮”,按每户发放,而不是手机号或者什么别的号领取。
pangdundun996
2024-07-30 09:58:42 +08:00
从 op 的需求来看感觉没必要做那么复杂啊:
1 )以小孩为唯一 id 建立家庭组;
2 )家庭组中的小孩才能消费家庭权益;
3 )家庭组中的家长才能为此家庭组购买权益;
4 )后续所有的业务策略作用在家庭组上就好了
pangdundun996
2024-07-30 10:00:49 +08:00
@pangdundun996 至于说多孩家庭别人创多个家庭组享受新手优惠我觉得是合理的
flmn
2024-07-30 10:06:59 +08:00
图数据库
v2defe
2024-07-30 10:09:02 +08:00
既然实名了,用身份证号关联注册的用户不就行了,判断注册的用户是否有已关联账号,只需要根据身份证号来找。或者不用证件号,生成一个 uuid 来标识也可以吧
junkk
2024-07-30 10:13:32 +08:00
实名怎么做的,建议接入支付宝的实名,需要人脸,这个难度就高了很多
qW7bo2FbzbC0
2024-07-30 10:21:16 +08:00
图数据库 neo4j 为例:

返回与张三最多两度关系内的关联人手机号

Match (p1:Person)-[*0..2]-(p2:Person)
WHERE p1.Name='张三'
Return Distinct p2.Telephone


可以去网上搜搜 neo4j 的案例深入了解下
mightybruce
2024-07-30 10:27:15 +08:00
用人脸以及其他身份信息会直接导致用户不会下你的应用,获取用户的额外身份信息觉得是馊主意。
说实话你都是线下为主,那么线上只是辅助了, 录入一些信息校对是比较容易的, 线下核对为主。

是否是分身,我可以提供一点思路是早期用户都是邀请制, 点击链接必须要带上邀请码,这个邀请码就关联了一堆相关用户。

其次用户下载应用的浏览器要录入该浏览器的指纹,这样只要再用这个浏览器再注册新用户也只会判断为同一用户,浏览器指纹是多个属性,不管改了其中几个属性的值,还会判断为同一用户,如果实现困难,建议买一些付费的浏览器指纹识别前端库。
qW7bo2FbzbC0
2024-07-30 10:28:00 +08:00
你说的是否直接关联,在 neo4j 中就是一度关联,用关系长度进行过滤查询即可。
你说的取消关联,这个我不太理解,如果这两个是直接关联的话,那直接删除 p1 和 p2 的关系即可( delete relation 操作)
查询所有分身
Match (p1:Person)-[*]-(p2:Person)
WHERE p1.Name='张三'
RETURN p2

举个另外场景,查询与张三有性关系的人员(关系距离长度 100 以内),
Match (p1:Person)-[r:SEX*1...100]-(p2:Person)
WHERE p1.Name='张三'
RETURN p2
mightybruce
2024-07-30 10:40:56 +08:00
手机 app 倒是可以获取很多权限,像抖音在海外的 titok 直接检测 sim 卡信息,这个配合浏览器指纹就更方便判断是否为同一用户了。

至于关联, 简单的几层人际关系说实在不需要额外引入图数据库增加复杂度,又不是社交类应用。

数据库自关联查询可以解决层级关系。
zbowen66
2024-07-30 12:54:03 +08:00
这是军备竞赛啊👍🏻
RandomJoke
2024-07-30 13:25:14 +08:00
有那么复杂么。。。。你们业务上要求娃的身份号,不管谁关联娃,每个娃只能享受一次优惠不就好了。。没理解需求啊
lazydog
2024-07-30 17:00:49 +08:00
@Grocker #6 那这就是一家之中只能享受一次低价课优惠。那如果亲戚家没有小孩子或者小孩子不需要,你们这个是否也会判别为同一范围的关联关系呢?如果是的话,感觉可以考虑 #17 楼说的。#19 的似乎是更普片的做法,也许可以借鉴。
42V0CdLjCU494ogF
2024-07-30 17:06:43 +08:00
网易云盾、极验等成熟的风控 SDK 方案为啥不用?

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

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

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

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

© 2021 V2EX