请教下 V2EX 的 Block 功能设计思路

2018-05-22 11:33:07 +08:00
 iyangyuan

目前来看,已经实现屏蔽用户、主题、甚至是评论。

这个功能看起来简单,实际上大大增加了查询复杂度,直接硬写 SQL 应该不是最佳实践。

所以想请教一下大家,有没有什么比较好的设计思路?

PS:这个问题应该是一类问题,好多系统在设计的时候都有可见性的需求,虽然形式不同,但都是这类交集差集的问题。

2465 次点击
所在节点    问与答
8 条回复
huiyifyj
2018-05-22 11:35:24 +08:00
v2 以前版本有开源的,就是不知道那个版本有没有 block 功能。
kera0a
2018-05-22 11:48:09 +08:00
做了个简单的验证,
全部 tab 下首页是 48 条数据,block 一位后,刷新首页变成了 47 条
所以查询应该是不带 block 条件的

接下来只是 48 条数据中,排除 block 掉的数据,这一步可以知道是很快的。

然后应该还有一些措施,防止 Block 数据过多时的额外处理
iyangyuan
2018-05-22 11:53:18 +08:00
@kera0a Block 数据过多,最容易想到的方法就是用后边的数据补充,但是这样做带来的后果是打乱了分页,必须为每个用户单独维护分页偏移量,否则下一页会看到重复的数据,真是纠结呀~
kera0a
2018-05-22 12:00:06 +08:00
@iyangyuan
页码分页就算不排除 block 数据,也得出现重复呀。
旧数据顶到前面,必然有数据后移。
据我观察 V2EX 重复就很多
kera0a
2018-05-22 12:02:08 +08:00
@iyangyuan 如果数据顺序不变,
翻页维护偏移量 不如简单的根据上一页最后一条数据数据确定下一页第一条数据
mywaiting
2018-05-22 12:07:43 +08:00
你仔细看看页面的 JS 不就知道了么?

<script type="text/javascript">
blocked = [];
ignored_topics = [];
$("#TopicsHot").children('.cell').each( function(index) {
for (i in blocked) {
if ($(this).hasClass('from_' + blocked[i])) {
$(this).css('display', 'none');
}
}
for (i in ignored_topics) {
css_class = 'hot_t_' + ignored_topics[i];
if ($(this).hasClass(css_class)) {
$(this).css('display', 'none');
}
}
});
</script>

不用想得这么复杂,其实用户根本不关心你分页,眼不见心不烦,帮 TA 隐藏掉就可以了~

顺便说,v2 这里没有啥黑魔法,代码走的基本都是最简单的套路,够用省事,当然了,也够粗暴
flowfire
2018-05-23 10:35:39 +08:00
不太懂。。。没有缓存的情况下难道不是直接 NOT 就行了么
John60676
2018-05-23 11:25:33 +08:00
@iyangyuan V 站确实存在重复问题,如果不是特别需求的话,少量的重复还是可以接受的

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

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

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

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

© 2021 V2EX