想象你是一个图书管理员。
你拥有成千上万本书的资产,这知识的海洋让你成为了一个精神富足的人。与此同时,你还慷慨地将图书开放给公众借阅,知识总要共享才更有价值。

所以你要好好管理你的书籍和借阅的记录,以免遭受书籍不知道被谁借了难以追回的苦痛。

47be09d7-e73d-4def-a9a3-806b8128d394.jpg
2021.07 摄于西安锦业路茑屋书店

存储与查询

在能正常运转借阅之前,上万本的书籍需要一个地方来放置它们,并且需要根据借阅人的需求找到书籍。

在《交互设计精髓》中提到了这样的概念:

通过位置存储和检索:存储和检索是不同的系统,但都能记住位置。

当书籍已经有了自己的存储位置时,需要用另一个系统查询它的位置——“检索”。
而我们不能保证每本书都能精确根据书号(书籍的具体位置,好比一个商场定位坐标)、书名或 ISBN 来找到,这样太考验记忆力了。
传统的图书馆除了书籍唯一编码的 ISBN,还提供了三个查找特征:作者、科目、标题。
eb9eac46-2501-4010-9ef0-d0d673d36df0.jpg
2021.07 摄于西安锦业路茑屋书店

当你想查找一本书时,这本书你忘记了它叫啥名儿,你可以用某一类索引找到书号范围,再继续缩小范围找到自己想要的书。比如你知道“社科”类书在 B-17~C-29 这个区域,接着再用子标签“社会心理”不断逼近你的范围,再在小范围快速查询。

所以书架和书号是存储系统,卡片索引是检索系统。你用一个系统确定所要的书,用另一个系统来索引它。
image.png

但是在数字世界中,有些事物可以不只是结构化的。
比如说一本书你可以将它归类到更多的科目下,项飙教授的《把自己作为方法》,在现实世界中,它存在于“社科”科目下的“社会学”分类。最多还会在增加一个“中国社会学”,可能再往下就很难去分了。

但是在数字世界中,这本书可以和“社会学”有关、可以和“项飙”有关、可以和“中国社会学”有关、可以和“人类学”有关、可以和“谈话录”有关、可以和“个人经验”有关、可以和“上海文艺出版社”有关,甚至可以和“2020 年出版”有关。

image.png

当你在检索时,你有上百个找到它的方式,就像你根本不知道你要读什么书,只是在寻找一本“上海文艺出版社”并且是“2020 年出版”的书籍。

而这么多的标签,实在不适合增加字段来维护。

提供 10 个字段,用户总想要第 11 个字段

——《交互设计精髓 3》

所以关系型数据库诞生了,虽然这在技术术语中是一个老旧并且基础的词汇,但在非技术人眼中它依然“听起来很 nb 的样子”。
你可以在另一张表中维护这些风格迥异甚至是一次性的“标签”,然后让这本书和另一张表的这些“标签”关联起来。

有了这些标签,你完全可以用自己的语言找到想要的书。

image.png

管理借阅记录

一本书总会不停产生借出、归还、再借出、再归还……的记录。

现实世界中,可能需要两个本子来记录这个事件:

  • 谁在什么时间借出或者归还了某个编号的书籍
  • 书籍库存表,当书籍被借出或者归还时,要把状态更新为已借出或者✅ 在库

image.png

在数字世界,你通常喜欢这么做:
借书出库时,在「库存表」找到这本书,给这本书的关联的「借出记录」新增一条借出记录;
还书入库时,在「库存表」找到这本书,给这本书的关联的「归还记录」新增一条归还记录。

image.png

然后通过一些公式计算自动标记这本书是 已借出 或者 ✅ 在库 的状态。

找到那条最新的关联记录

但是通常而言,如果这本书如果已借出,作为管理员的你可能想知道这本书现在被谁借走了。
那么,你需要找到这本书最近的一条借阅记录,然后查看记录的借阅人是谁。

茫茫关联的借出记录中,如何找到这条记录?

如果你用 Excel,你可能知道这么个函数:FIND()

返回一个字符串在另一个字符串中出现的起始位置(区分大小写),找不到返回0。

FIND(要查找的字符串,从哪里查找的字符串,[从第几个字符开始找])

用 FIND() 公式来书写,可以这么写 FIND(“最新的借阅记录”,{这本书的借阅记录})

要找最新的借阅记录,就需要在这本书的所有借阅记录中,按照 {借阅日期} 倒序排序 后,第一条就是要找的这条记录。
image.png

再把借出记录中的“借出人”信息显示在这本书的字段中。大功告成,这样就实现了已借出的书籍自动显示当前的借出人。

用过数据表的同学都明白“关联”(Link Record)字段是来实现书籍库存和借出记录的关联关系的,比如 Airtable、Notion、Smartsheet、飞书多维表格……

image.png
image.png
Airtable 书籍库存&借阅记录 表

然而可能也会和图书管理的场景一样,需要找出某一条确切的关联记录。
比如“设备”关联了“出租记录”,想要找到当前某个设备最新一次出租的人是谁,他的电话号码是多少。
又或者“月份”关联了“销售记录”,想要找出当月销售额最高的销售员(当月销售冠军)。
再或者“科目”关联了“考试记录”,想要找出这个科目考的分数最高的前十名,以便奖励。

这个“自动按条件和顺序查找某条关联数据”的功能在黑帕云中,今年7月份以新字段的能力发布,它被命名为「动态关联」(Dynamic Link Record)

它依赖一个关联字段,并且这个字段允许关联多条数据。设置了依赖关系后,开始设置查找范围。之后再设置排序字段和排序方式。

在图书管理场景中,需要设置依赖的关联字段是“借阅记录”:
image.png

查找范围可以是全部这本书的借阅记录。
但如果业务上存在借阅有“待审核”、“已出库”的状态。为了防止让提交了借阅申请但还未被节奏的记录被统计在内,那么可以设置查找范围是“已出库”:
image.png

排序字段则是“借阅日期”,按照“倒序排序”,再选择第一条借阅记录。
这样,就顺利把这条关联数据找出来了。

image.png

如果需要更多的信息,那么可以继续在库存表中创建“引用”字段来引用“动态关联”字段(最新借阅记录)中的其他字段。

image.png

结语

在电子表格或者多维数据表格的协作中,可能没有这样查找一条关联数据的场景。但是在企业业务中非常常见,动态关联(Dynamic Link Record)的最初来源正是我们一位做园区房屋租赁的企业用户提出的,他们用来管理房屋的出租、收房业务,在房屋列表中就非常需要直观看到当前房屋承租人是哪家企业。