在已经掌握了基本的 Notion 数据库功能后,随着实际项目的应用,你可能会产生更多的困惑,诸如字段内容查重、多级标签自动匹配等。本文旨在分享我的使用过程中想要实现的功能与解决方案,也许不是最优的,如你有更便捷的技巧或者其他思路,也欢迎在评论区一起研讨!
查重的使用场景
查重作为数据库构建的一项基本功能,是排除重复信息干扰、确保唯一性数据准确性的校验手段。而若能做到在特定数据有重复时自动警告并执行特定操作,将极大地提升用户体验。这里我举几个例子:
- 过滤掉机器人复制粘贴式的批量评论
- 标注出同一个人的多次领奖记录
- 给文章的分词数据按照重复次数排序以便制作词云
- 监测在短时间内发生多笔相同金额和商家的消费

完善的查重机制能节省大量人工判断的成本,并且在第一时间获知结论。如果这正好符合你的需求,且你正在使用 Notion 数据库来管理数据,那么不妨继续往下看吧~
查重功能的实现
Notion 数据库中的每一行(页面)有着天然的独立性,即便行与行之间共享着统一的字段,但数据库的架构决定了他们之间并不能直接实现跨行的信息访问,目前唯一的方式是通过 Relation 字段来解决。如果你已经掌握了数据库的基本功能,想必你应该了解过 Sub-item 这个特性:通过 Relation 字段链接数据库自己,就可以依照 Parent-item(父级)和 Child-item(子级)来构建带有指向性的跨行信息访问。那么当你希望上述的两个字段能基于其他字段的内容来 「智能」选择所需链接的页面时,单凭 Relation 字段本身就无能为力了。因为 Relation 字段的内容输入方式重度依赖手动选择,对于想要实现高度自动化的数据库来说无疑是需要另辟蹊径的。
在此之前,我非常推荐少数派与 @二一的笔记 联合推出的《Notion All in One:大家高能效率系统》。其中深入浅出地讲解了 Notion 丰富的能力,由于本文会涉及一定的数据库函数编辑,没有基础的小伙伴或能在这篇终极指南中受益良多。
回到正题,通常来说,我们会希望「智能选择」的范围是当前数据库的所有页面,但由于将每一页关联上其他所有页的手动成本过高,我们需要一个自动化的「中转数据库」来代为处理。这里我将以「玩家IP地址查重」为案例来演示。

一对一查重
基于兴趣,我目前在一个非营利性的游戏服务器运营团队中任职。在调查和把控对游戏社区有害的玩家时,我们常常需要甄别该玩家是否有其他小号,以便于我们在封禁该账号的时候也能「照顾」到他的其他「马甲」。IP地址可以展示玩家所在位置的大致区域,由于我们的玩家群体遍及全球,相同IP地址的情况少之又少,所以我们选择通过它来辅助决策。

如上图所示,现在我们有三名玩家以及他们各自对应的 IP 地址,我们的目的是让 查重
字段展示出有着相同 IP 地址的其他玩家的 ID。
构建「中转数据库」
接下来,新建一个数据库,并添加一个 Relation 字段,关联到上文中这个玩家数据库,然后先手动链接到这三名玩家。

Show on 玩家数据库
的开关打开!
回到玩家数据库,这时我们就能看到每一名玩家在新出现的 Relation 字段里都与数据中转库中的同一页关联上了。

模板与自动关联
现在,我们需要让后续新添加的玩家自动关联到同一个数据中转页面,所以我们需要利用数据库的模板功能。

在玩家数据库新建一个模板,并且设置好 数据中转库
字段关联的页面。退出模板编辑,并将改模板设置为默认模板。

利用 Formula 执行查重
最后一步,同时也是对没有代码或者 Excel 函数基础的读者最难的一步,就是编辑 Formula 字段了。
首先,我们需要判断 IP地址
为空的情况,在此情况下我们也将 查重
留空。代码结构如下图。

其次,我们需要通过 中转数据库
字段中链接的页面(是第一个页面同时也是唯一一个页面,因此得使用 .first()
或者 .last()
等函数来获取到该页面,而不是含有该页面的页面列表)来间接访问玩家列表。代码结构如下图。

下一步,我们要对获取到的玩家列表使用 .filter()
进行筛选。筛选条件其一是:IP地址相同;其二是:排除掉玩家自身。如下图。

结合我们最开始对于留空情况的考虑,整个函数结构如下图。

现在数据库就能依托函数自动甄别重复的 IP 地址,并将重复的玩家 ID 列出来(如果有多名玩家的 IP 地址相同,也会一并列出来)。

一对多查重
然而,实际的使用过程中就会发现,一名玩家可能会使用多个不同 IP 地址登录服务器,也就有了一对多查重的需求。现在,我们需要新增一个字段 IP地址集合
用来存放该玩家所有使用过的 IP 地址,并按照由新到旧排列(该字段会由 Bot 从游戏服务器内抓取内容并通过 Notion API 导入)。
多行文本处理
同时,我们可以把 IP地址
修改为 Fomula 字段,让其能够自动摘选 IP地址合集
中的第一行内容(最近使用的 IP 地址)。函数如下图。

我们也更新一下示例数据,这样等会儿就能看出更明显的差异。

分别映射与逻辑判断
接下来回到 查重
函数字段,我们需要让每名玩家的 IP 地址与所有玩家的 IP 地址列表一一进行比对,进而充分考虑到每一种重复的可能性。这里我们会对 .split()
之后的每一条 IP 地址进行比较,并且一旦有任意一个相同的情况就应该整体返回 true
。

通过上述方法,最后我们会得到如下图所示的结果。

当我们利用 Notion API 完成数据的导入后,由 Notion 自己完成部分运算并借由 Gallery View 或者 Board View 展示出来,就起到了类似数据仪表盘的作用。在这之上,继续使用 Automations 来监听「查重的结果」就可以通过 Slack 等通讯平台向管理者发出提醒。

诚然,这里我们仅仅是用每名玩家的最近 IP 地址与所有出现过的 IP 地址比较,对于 「两名玩家曾经使用过同一个 IP 地址」这种情况是无法体现出来的,这个就留给读者自行思考了。
拓展与思考
由于 Notion Formula 并未提供直接跨行访问的函数,我目前能想到的就是通过中转数据库的方式来实现。除了上文中提到的「查重」功能之外,也适用于更多需要自动化处理来辨别数据库内的其他页面信息的情况。
日期字段匹配与快速翻页
如果你有日记、工作纪要的需求,并且经常反复翻看的话,那么这项功能应该适合你。同样是利用一个中转数据库,我们这次让「日记」数据库可以间接跨行访问,通过日期的排序和比对,就可以定位到「前一天的日记」和「后一天的日记」,效果如图。

让每一篇日记自动找到上一篇和下一篇,使翻页浏览体验更加顺滑。具体的实现方式如下。

如有需要,可以前往这里查看本文中提到的三个数据库页面~
结语
Notion 作为一款模块化的记录工具,因其丰富的数据交互能力而迅速蹿红,灵活的使用方式也招来了大批的模仿者,这其中有优有劣。但其云端笔记的特性,导致复杂的数据库运算往往会带来延迟和卡顿。优化函数算法的复杂度是一个解决方案,同时也希望 Notion 官方在数据运算和函数功能性上提供更多的可能性。
本文旨在介绍我常用的一种自动化信息展现方式,我只具备比较初级的编程能力,如有谬误或者更优的方案,欢迎于评论区指出~ 也欢迎提出你在 Notion 的使用过程中遇到的麻烦和痛点,也许我和其他读者能为你提供解决方案(也说不定会成为我下一期的选题)。
> 下载少数派 客户端、关注 少数派小红书,感受精彩数字生活 🍃
> 实用、好用的 正版软件,少数派为你呈现 🚀