我并不喜欢数据库,主要是我不喜欢数据库代表的那种自顶向下生成的内容记录方式。我喜欢双链,喜欢的主要是双链那种自底向上,无压输入的轻便。
注:思源的数据库其实有一个很好的功能,点击块标,在菜单里选择「添加到数据库」。但对我来说,这个操作不够无压。
🔗 然而,我发现到双向链接虽然美好,但也存在一些问题:随着笔记内容和双向链接数量的逐渐增加,维护成本也随之升高。
🤔 核心的问题在于,双链关系本身缺乏描述性的语义信息。 举例来说,同样是链接到“灵感”这个节点的链接,有的可能代表天马行空的联想,有的则可能是针对具体项目的工作思路。但在传统的反链面板中,这些链接在语义上并没有明显的区分。
最近接触了一下 Tana 的 super tag 后,有了一些新想法,并尝试把思源的双链和数据库结合在一起。在简单研究了 tana 一下之后,我认为 Super Tag 的核心要点在于:将自下而上的引用方式与自上而下的数据库管理逻辑融合,从而实现了自下而上地构建数据库。
这里的关键点在于两个:
- 自下而上地生长: 表格结构的形成源于零散的笔记内容聚合积累,而不是在预先设定的顶层页面中手动逐行添加结构。
- 关联关系的元属性: 这是传统反向链接(包括思源的反向链接)所欠缺的。 传统反链只提供简单的链接关系,而缺乏对关系本身进行自定义属性描述的能力。
不管别人怎么描述和理解,在我看来,Tana 的 SuperTag 就是这样一种“高级双链”的方案。 它保留了传统双链自底向上生长的模式,还有效地弥补了传统双链在引用关系语义表达上的不足。
思源里面没有 SuperTag,但是思源有双链,有数据库(属性视图)。我想了想,也许可以尝试把这两个东西结合在一起,探索出一种类似 SuperTag 的解决方案。
基本设计思路
具体而言,通过以下步骤实现 “SuperRef” 的概念:
- 双向绑定: 将一个主题文档和与之关联的数据库绑定在一起,形成一个整体。
- 块引用: 在其他文档中可以通过块引用的方式链接到这个主题文档。
- 属性存储: 数据库则专门用于存放这些引用关系的相关属性信息。
- SuperRef 构成: 最终,被引用的 主题文档 + 与其绑定的数据库 共同构成一个 “SuperRef”。
一个简单的实现
尝试简单实现了一下(F-Misc >= v5.1.0)。
以下简单展示一个使用示例。
-
主题文档:「TODO」
创建一个名为「TODO」的文档,作为我们的主题文档。
虽然在思源中,双链引用可以应用到任意类型的块上,不过我还是做了简化设计:只有文档可以被当作一个 SuperRef 的目标。(我觉得这很合理)
-
在其他文档中引用「TODO」
在其他文档中编写内容时, 当需要引用 TODO 事项时,我们插入一个块引用链接到「TODO」文档。
-
绑定到 SuperRef 数据库
右键点击双链菜单中的引用链接,选择 “绑定到 SuperRef”。
-
自动创建的 SuperRef 数据库
返回「TODO」文档,会发现文档中已经自动创建了一个与该文档绑定的 SuperRef 数据库。 同时,在刚刚引用的块的右上角,也会出现一个数据库标识,表示该引用已关联到 SuperRef。
注:数据库和文档的双向绑定是通过设置块属性实现的。
文档中会设置指向数据库的块属性;而数据库块也会设置指向文档的块属性。所以理论上你也可以把自动创建的数据库移动到别的文档位置,同样能生效。
-
编辑引用属性
点击块右上角的数据库标识,即可打开属性面板,对该引用的属性进行编辑和管理。
以上演示的是 自底向上 创建 SuperRef 的流程:从引用开始,逐步创建主题文档和数据库。
除了自底向上,也可以 自顶向下 的创建: 在主题文档中,通过文档菜单选择 “插入 SuperRef 数据库”并自动创建属性数据库,并将所有已有的双链引用自动添加到数据库中进行管理。
此外,如果在引用创建时没有立即绑定 SuperRef,也可以稍后在数据库中进行状态同步,将新的、尚未加入数据库的链接补充进来,确保所有引用都被纳入 SuperRef 的管理。
思源数据库的结构非常灵活,允许任意块同时加入多个不同的数据库。 这与双链的灵活性天然契合,意味着我们可以为同一个块绑定多个 SuperRef 数据库,从不同维度管理和分析引用关系。
重定向链接机制
考虑到我个人的使用习惯,在将引用的内容块绑定到数据库时,实际绑定的是重定向之后的块,而非直接引用所在的块。 这项机制的详细解释可以参考 QueryView 插件 - 链滴 文档中关于 “容器块传递” 部分的说明。
简单来说,重定向规则如下:
- 容器块引用: 如果引用位于列表项块、引述块、超级块等容器的第一个段落块中,则整个容器块会被绑定到数据库。
- 文档首段引用: 如果引用位于文档的第一个段落中,则整个文档会被绑定到数据库。
- 标题下方首段引用: 如果引用位于标题下方的第一个段落中,则标题块会被绑定到数据库。
顶层管理
配合「书签 +」插件可以在侧边栏中统一管理这些 SuperRef 数据库。
在书签 + 中创建一个动态书签组,类型为 SQL,并使用如下的代码:
select * from blocks where type='av' and ial like '%custom-super-ref-db%' order by updated desc;
然后就可以在顶层直接查看所有数据库了。
🤔 长久以来,思源的双链和数据库之间的关系都非常割裂。以上我提到的算是一个抛砖引玉的想法,将双向链接和数据库功能结合起来试图实现 1 + 1 > 2 的效果。当然,这也仅是一个初步的尝试,还有细节需要优化。
插件代码遵循 GPL-v3 协议开源,欢迎有想法的朋友自行扩展和尝试。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于