阶梯式动态数据库:SuperRef 与动态数据库应用初探

缘起

本文主要是总结本人在 SuperRef 和动态数据库的应用方面的实践心得,还有本人一些不太成熟的思考。本文之所以能够出现,要感谢 F 佬(Frostime)设计制作的两大突破性的数据库应用工具:SuperRef动态数据库。

  • 欲了解这两个工具,以及了解本文所述的核心内容,必须先通读以下两篇文章:

  • 这两个工具被 F 佬装进同一个插件 F's 工具箱 里,也可以说,它们其实是一体的。

    • 关于 F's 工具箱(即 F-misc),其实它还有很多强大的功能,比如 AI GPT 对话,这里不另行展开。

      image

    • 欲实现在思源笔记的侧边栏管理 SuperRef 与动态数据库,还需安装 F 佬制作的另一个插件:

      image

      注意:一定要在已有 SuperRef 或动态数据库的情况下,再使用书签 + 添加相对应的侧边栏查询代码,一定不要让书签 + 代码产生“空值”。

SuperRef 的特点是“专一”(一个块引绑定一个数据库),所以它的应用场景较容易想到(后文再细说)。而动态数据库则不然,它既能“锁定”关键词,也能“锁定”标签,还能锁定多个;由于它是基于 JS 代码的,它的应用更加灵活,但由此带来的困惑也更多——动态数据库到底该怎么用?

这个问题从该工具被创造出来时就已存在。(以下内容引自《尝试通过查询语句来动态构建数据库》)

不过说实话,我自己尝试几天后,发现这个功能的定位有点尴尬。

……这种动态构建数据库的方案上不去下不来,感觉有点鸡肋。到底实际价值有多大,就交给其他人来自行评判了。

即使 F 佬本人对动态数据库的功能定位提出过质疑,但它仍是一个突破性的工具。

我在 SuperRef 刚发布时,还是一个对 SQL 查询代码一窍不通的萌新。由于当时对反链和数据库的认知不足,对 SuperRef 的应用完全没有头绪,纯粹就是一个建好了摆着看看的工具。直到动态数据库发布,我才正式开始在笔记中应用这两种工具。直到现在,总算略有心得。

本文的初衷也是对自己的应用心得进行总结,以期梳理自己的思路,发现更多关于这两个突破性工具的用法。同时,也践行——输出,才是消化魔药知识的最快途径。

由于本人对 SQL、JS 等专业知识的了解非常浅薄(只通了半窍),所以本文所涉及的只是普通应用思路的层面,距离更深入的功能探索,以及形成方法论,还有很长的路要走。

由于本人水平有限,本文难免不足和谬误,请大家不吝斧正。

应用环境中存在的问题

本文的核心在于工具的应用,所以欲了解本文所述,首先要了解本文所述的 SuperRef动态数据库 这两个工具,及其应用环境。但这个话题太大,以下只就相关联的部分,略作阐述。

从 SiYuan 的三大标记工具说起

思源笔记有三个标记工具:

  • 第一个标记工具:标签。 这是最传统的标记工具,大部分的笔记都有。但在思源里,却一直处于比较尴尬的地位。主要是思源的标签管理面板功能性不足,基本依赖思源本体强大的全局搜索功能。

  • 第二个标记工具:双链(块引)。 这是当代笔记的革命性标记工具,正是由于双链的出现,使得标签能做的事,双链也能做到,某种意义上让思源中标签这个工具的地位变得比较尴尬了。

  • 第三个标记工具:数据库。思源的数据库本身是一个强大的信息管理的工具,但巧妙的是,它其实还可以当成标记工具和属性面板来用。

    • 所有被添加到数据库的内容块的右上角,都会出现一个数据库角标,这是一种很特别的标记。

    • 鼠标在角标上悬浮,会弹出数据库页面;点击角标,会弹出数据库信息(属性面板)。

      (效果展示详见后文)

然而,问题来了。

思源的这三个标记工具中,只有数据库标记能够进行信息拓展,它能够在内容块的元信息以外,通过创建新的数据表单项,拓展更多额外“属性”。而标签、双链,在这方面却有先天性的不足。

存在的问题:缺失的维度

标签管理的现状
  • 思源的标签管理面板有点简陋

    • image
    • 全靠思源本身强大的全局搜索功能。
  • 标签管理所缺失的维度

    • 缺少筛选、过滤功能;
    • 缺少更便捷的管理功能;
    • 缺少拓展额外信息的功能。
双链管理的现状
  • 思源的双链管理相对较完善

    • 思源自带的反链面板,具备了筛选功能。

      image

    • 一些插件提供了更好用的底部反链功能。

      • 具备底部反链功能的插件

      • 底部反链的作用

        • 直接在文档底部展现该文档的反链,查看更直接;

        • 增加了反链的筛选、过滤等功能。

          (以下是笔记中的本文的叶归插件底部反链)

      image

    • 嵌入块 + 代码,以及个别挂件也能支持多样化的反链查询。

      • 原生:嵌入块 +SQL 代码嵌入块 +JS 代码,均支持反链查询。
      • Query 挂件:支持用 SQL 代码查询反链。
      • Query & View 插件:支持用更丰富的 JS 语法来查询反链,并能以表格等样式呈现。
      • 其他……我还不了解的方法。
      • 具体方法(本文略,请自行在链滴社区搜索)
  • 双链管理所缺失的维度

    • 缺少拓展额外信息的功能。
额外信息”到底是指什么

他山之石,可以攻玉。要弄明白这个问题,最直接的方式就是看看其他笔记软件有什么更出色的表现。这就不得不提 Tana 带来的 SuperTag,超级标签了。

SuperTag 赋予了传统标签新的功能,让普通标签能拥有一套属于自身的信息结构(变成像属性一样),还能在列表中展开,相当于给每个标签绑定了一个数据库。这个数据库不仅能以子列表的形式展开,还能让子标签直接继承母标签的信息结构(属性)。

Tana 的节点在 Supertag 的帮助下有了类似 Notion 的字段和列表视图,更进一步的,它也可以拥有像 Notion 一样的表格、画廊或者日历视图,你可以自由地在不同视图(View)之间切换。

思源本身所具备的三大标记工具之间是割裂的,没能打通。

曙光:SuperRef 和动态数据库的突破

于是,F 佬针对这一问题,制作了 SuperRef 这一突破性工具。(以下内容引自《将反向链接和数据库结合的尝试》)

🤔 核心的问题在于,双链关系本身缺乏描述性的语义信息。……在传统的反链面板中,这些链接在语义上并没有明显的区分。

这里的关键点在于两个:

  • 自下而上地生长: 表格结构的形成源于零散的笔记内容聚合积累,而不是在预先设定的顶层页面中手动逐行添加结构。
  • 关联关系的元属性: 这是传统反向链接(包括思源的反向链接)所欠缺的。 传统反链只提供简单的链接关系,而缺乏对关系本身进行自定义属性描述的能力。

SuperRef 的意义恰恰在于:将双链(块引)与数据库结合起来,由此,赋予了双链(块引)拓展额外信息的功能。

深度使用思源的双链(块引)后,我们就会发现,仅靠反链面板或底部反链来管理复杂、多层交叉的反链,仍有不足。

同时,当我们在正链的位置进行悬浮浏览时,虽然能看到所链接的对象(文档内容),但对于我们当初为什么要链接到这一对象,经常需要自己“脑索”最初的记忆了。问题就在于,时常会想不起来。

而假如双链所在的块,本身能够通过绑定的数据库来添加额外信息,假如这信息里又有一项是“为什么连接到[[AAA]]”,那问题不就简单了。

后来,F 佬又在发布《尝试通过查询语句来动态构建数据库》的同时,推出了动态数据库,进一步将数据库与标签结合起来,甚至还将数据库与关键词查询也结合起来。

这样一来,思源的三大标记工具之间就被初步打通了,甚至这种突破还延伸到了关键词查询,让思源数据库的功能得到了质的提升。

恍然:且谈我最初的思维误区

在我最初使用 SuperRef 时,受以前使用思源数据库的旧有经验局限,曾一度陷入一个思维误区。在看过《Tana:2022 最惊艳的笔记软件》一文后,我终于才真正读懂了 F 佬的话(引自《尝试通过查询语句来动态构建数据库》):

我认为 Super Tag 的核心要点在于:将自下而上的引用方式与自上而下的数据库管理逻辑融合,从而实现了自下而上地构建数据库

以下是一个恍然大悟自己已经走了弯路的人的反思:

  • 突然发现自己之前的一个思维误区:只是把数据库当成分类表、状态表、进度表来使用。今天看了关于 SuperTag 的介绍才发现,我错了。

  • 每一个 SuperRef 或动态数据库,应该都是精心设计的信息框架。

  • 应该让数据库真正成为高价值信息库,必须要精心设计,应该探索更丰富的用法。

    • 比如 [[书]]#book 产生的 SuperRef 或动态数据库,可以展开类似豆瓣读书数据库一样的书籍信息。
    • Ideas 数据库,也应该展开关于灵感的更深入思考的内容,而不只是后续处理的阶段。
    • 应该把这类 SuperRef 或动态数据库,作为概念属性(思考拓展)的信息载体。

然后,我迫不及待地修改了我的 SuperRef 数据库。修改之前,我的 SuperRef 数据库是这样的:

image

初步修改之后,是这样的:

image

而在正链所在的块,右上角的数据库角标是这样的(特殊效果来自数据库数据展示插件):

image

数据库属性面板是这样的:

image

当然,这只是未经实践的拍脑袋式修改。

本想略过的基础应用介绍

由于 F 佬已经在 将反向链接和数据库结合的尝试》与 尝试通过查询语句来动态构建数据库》讲述了 SuperRef 与动态数据库的用法,所以,我本想省掉这一块(实际也没打算详细展开)。但觉得仍有一些个人的应用心得,可以与大家分享交流一下。

SuperRef 的基础应用

  • 操作步骤:详见 将反向链接和数据库结合的尝试

  • 几点提示与建议

    • 绑定的双链所对应的文档,可以是新文档,也可以是旧文档,但最好(必须?)是空文档。

      • 旧文档原有内容可以复制到一个副本中,如果直接用旧文档生成 SuperRef 数据库,原有内容可能会被覆盖。
      • 建议先在空文档中生成 SuperRef 数据库,生成后,可再自行添加其他内容。
    • 绑定的双链所对应的文档,还可设定别名,让语义相同但表达不同的块引,归于一库。

      • 比如 Todo 文档,我就设定了 待办未来记录 等别名。
    • 创建数据库之前,所有已建立的同一块引,会在数据库创建时自动添加到库中。但

      • 创建数据库之后,再建立的块引,就需要在数据库块标的右键菜单里点 插件 - 更新SuperRef数据库 才能更新到数据库中了。
      • F-misc v5.7.2 版本起,可在 F-misc 的 设置 - 其他设置 中勾选 自动刷新 SuperRef 数据库,可在打开对应文档的时候,自动刷新 SuperRef 数据库。

动态数据库的基础应用

  • 操作步骤:详见 尝试通过查询语句来动态构建数据库

  • 基础的查询代码(来源同上,有改动)

    • 关键词查询(示例)

      //!js
      const blocks = await sql("SELECT * FROM blocks where (type='p' or type='d' or type='h') and (content LIKE '%关键词A%' or content LIKE '%关键词B%'");
      return blocks.map(b => b.id);
      
    • 标签查询(示例)

      //!js
      const blocks = await sql("SELECT * FROM blocks WHERE (type='p' OR type='d' OR type='h')  AND (tag LIKE '%#标签A#%' or tag LIKE '%#标签B#%'");
      return blocks.map(b => b.id);
      
  • 我的最初体会

    • 标签式动态数据库很有用,更有利于对标签对象进行管理。

      • 用数据库后,可以设置不同的筛选视图,并给标签对象的情况加额外属性。
      • 对于普通的标签,可以不需要这一步;但对于有后续管理动作的标签,动态数据库就很有用了。
    • 关键词动态数据库,使一些特定的日常札记的收录,更加便捷。

      • 比如,我偶尔会在日记中记录自己做的梦,以前需要右键送到相应数据库。虽然也可以用 SuperRef ,但会多一个动作。

      • 现在,只要描述前有 @做梦:,这一段落块就自动添加到记录梦的数据库了。对于日常札记这种很普通的事来说,完全不需要有多余的动作,只要记录的内容中有特定的表述就行了。

        • 注意:用特殊符号包裹关键词,是我最新的用法,这样可以最大限度地避免误录普通使用该词汇的内容块。
        • 最开始,我用的是“做了个梦”或“做了一个梦”,这样的方式还是会有误录。
      • 这一方式不足是,关键词不能过于通用(简单),否则如果别的文章里刚好大量使用了该词,那就是“灾难”了。

    • 创建数据库之前,所有已添加的标签(关键词),会在数据库创建时自动添加到库中。但

      • 创建数据库之后,再添加的标签(关键词),就需要在数据库块标的右键菜单里点 插件 - 更新动态数据库 才能更新到数据库中了。
      • F-misc v5.7.2 版本起,可在 F-misc 的 设置 - 其他设置 中勾选 自动刷新动态数据库,可在打开对应文档的时候,自动刷新动态数据库。

SuperRef 与动态数据库的区别

  • SuperRef
    • 通过双链(块引)建立数据库,一对一,悬浮时还可看到下文。

    • 适用场景

      • 单一主题、单一概念、单一类型(但可有多个别名)
      • 前提:主题(概念)具有独立性,有独立的数据结构,即与其他同级概念无法共用相同的表头,需要单独设立数据库,比如[[图书]]、[[影视剧]]、[[思源应用]]等。
  • 动态数据库
    • 通过标签/关键词建立数据库,可多对一。纯粹的一对一,不如用 SuperRef。

    • 适用场景

      • 多个子概念,对应到一个大类(数据库)。
      • 前提:各个子概念,应用上确实会存在差异,但底层需求结构(或逻辑结构)是一致的,因而对应的数据结构基本一致,可用同一套表头。
    • 例子

      • 动态数据库出来之前,我把 [[闪念]][[灵感]][[选题]] 这三个块引,各绑定了一个 SuperRef 数据库。

        • 阵容很豪华,但非常不经济。
      • 动态数据库出来后,我把原来用块引标记的方式,分别改用 #闪念#灵感#选题 来标记,然后绑定到了同一数据库,并将之命名为 Ideas 数据库。

进阶应用初探:通过区别看本质

以上浅析了 SuperRef 与动态数据库的区别,在简化表述下,约等于:

  • SuperRef:一对一建立块引数据库。

    • 虽可用别名间接关联多个词,但绑定 SuperRef 的块引所呈现的词,仍是唯一的。
  • 动态数据库:多对一建立标签数据库,或关键词数据库。

所以,这就是一对一多对一的关系吗?并没有这么简单。

SuperRef 的应用场景初窥

  • SuperRef 的应用场景
    • 写作:[[作品标题]]绑定 SuperRef

      • 收集写作素材时
      • 产生写作灵感时
      • 想到新的段子时
    • 项目:[[项目名称]]绑定 SuperRef

      • 项目所需资源
      • 项目阶段目标
      • 项目阶段成果
    • 主题 MOC 反链的自动汇总

      • MOC 主题的块引一般是唯一的,虽然手动 MOC 更有价值,但偷懒的话,也可以用 SuperRef 来进行汇总。
    • 笔记应用

      • [[思源应用]]:绑定 SuperRef,可将所有收集到与思源应用有关的技巧、引述、代码,统一入库。
      • [[思源问题]]:绑定 SuperRef,将遇到的思源笔记问题、BUG,及解决方法,统一入库。
    • Daily Note 流相关的标记

      • [[ToDo]]:给 Daily Note 中的待办事项打标记,绑定 SuperRef 自动入库。
      • [[备忘]]:给 Daily Note 中需要日后备查的事项打标记,绑定 SuperRef 自动入库。
    • 更多……(懒得想了-_-!)

动态数据库:又一个“小问题”

我在上文给出了动态数据库的基础查询代码,这个代码其实是放在动态数据库弹窗提示中的,我只是根据 尝试通过查询语句来动态构建数据库》一文图片中的代码,略作修改,增加了 OR 语句,初步实现了标签、关键词内容的多对一入库。

  • 这也是我最初用的代码,当时我没有跑通 F 佬图片中的代码,只好先做了折中。

但后来我在应用过程中发现,这个折中的基础代码是基于 SQL 查询的,由于限定了只查询文档块、标题块、段落块(通过 WHERE (type='p' OR type='d' OR type='h') 代码),所以如果标签(关键词)所在的块是列表块的话,在数据库对应主键的悬浮弹窗里,默认就只会显示标签(关键词)所在的那一个段落的内容。

  • 即使标签(关键词)就是列表块的第一项,也不会显示它的子列表项。

    image

  • 虽然在数据库对应主键的悬浮弹窗里,我们可以通过点击右上角的“上下文”按钮,来展开当前段落块的上下文,但这毕竟要多一步操作,不是很方便。

    image

  • 我也曾经尝试过增加 OR type='l'(列表块),但它会与段落块的内容重复被汇入数据库(即出现重复项)。所以,这个方法不太好用。

查询的“核动力”:Query & View

其实,针对这个“小问题”,F 佬已经给出了解决方案,就是用 Query View 代码来搜索,因为 Query View 具备重定向链接机制,通过“容器块传递”代码,能轻松解决这个问题。

  • 关于重定向链接机制,请自行参阅 F 佬的关于 Query View 的文章。

就在写本文之前,我经过学习与反复尝试,终于在 Query View 基础代码的框架下,将查询代码改成了 QV 语法的代码,能在悬浮时展现标签所在的列表块了:

image

  • 注意:以下代码需要安装 Query & View插件,因为必须要 Query & View插件来提供语法支持。

    image

  • 关键词查询 QV 代码(示例)

    //!js
    const query = async () => {
        const SQL = `
    	    select * from blocks where (type='p' or type='d' or type='h')
    	    and (content like '%@短关键词:%' or content like '%长关键词%')
        `;
        let blocks = await Query.sql(SQL);
    		blocks = await Query.fb2p(blocks);
        return blocks.pick('id');
    }
    return query();
    
  • 标签查询 QV 代码(示例)

    //!js
    const query = async () => {
        const SQL = `
    	    select * from blocks where (type='p' or type='d' or type='h')
    	    and (tag like '%#标签A#%' or tag like '%#标签B#%')
        `;
        let blocks = await Query.sql(SQL);
    		blocks = await Query.fb2p(blocks);
        return blocks.pick('id');
    }
    return query();
    

动态数据库的应用场景初窥

  • 动态数据库的应用场景
    • 关键词自动收集

      • 反思、复盘、做梦、美食等日常记录,可通过关键词来自动收集。

      • 关键词最好前后用特殊符号前后包裹(比如用 @…… 来包裹),避免误录。

        • 也可以用别的特殊符号,但最好是容易输入的,方便日常操作。
      • 可将多个关键词汇总到一个数据库里。

    • 标签自动收集

      • 常规用法:N 个标签一个数据库来管理

        • 在查询代码中,用 OR 来汇总多个标签到一个数据库。

          • 适合对意义相近的一组标签进行统一管理。
          • 减少数据库冗余,减少对数据库的关注度。
      • 常规用法,一定意义上可以说,是动态数据库存在的原因。

        • 如果没有“多对一”的需求,那为什么不直接用 SuperRef 呢?
        • 如果只有一个标签,那我完全可以用块引来代替标签,将块引直接绑定数据库。

最初时,我的动态数据库应用仅限于此。某天,在修改一个动态书签 SQL 代码时,我突然想到:

  • 我动态数据库代码用的是 OR 来组合标签,如果用 AND 来组合标签,会怎样呢?

OR,还是 AND,这是个问题

在冒出这个念头的那一刻,我就被这个想法迷住了。当时就把闪念记了下来:

  • 我们应该用更丰富的方式来使用动态数据库。

    • 方法 A:用 OR,来让多个不同标签的对象,汇总到同一数据库。

    • 方法 B:用 AND,必须要同时有二个(或以上)标签的对象,才能进入指定数据库。又可分成两种用法:

      • 用法 B1:只有单个 标签A 时并不想让对象入库,但再加一个 标签B 后就能入库。
      • 用法 B2:只有单个 标签A 时对象进入 库A,再加一个 标签B 后就再次进入 库B
    • 有趣的正是用法 B2,即同时满足 N(N≥2)个标签,会再次进到另一个数据库。

这意味着什么呢?

  • 我们先来看用法 B1。

    • 用法 B1:我觉得,它可以叫阻拦式动态数据库。

      • 其意义在于:某些标签,你并不想它一开始就入库,只有加上第 2 个标签时,它才会入库。

        • 那为什么不直接去管理第 2 个标签,这不是更简单吗?(很好的吐槽)
          • 直接管理第 2 个标签,有可能让其他不相关的场景也进入指定数据库。
          • 比如以下的例子,如果不用 AND 来附加 #美食 标签,那有可能让与美食无关但又标记了 #请客 标签的内容进入到美食相关的数据库。
        • 这只是一个特殊的例子,如果没这方面的顾虑,那完全可以只管理第 2 个标签(又或是块引)。
      • 我们来看一个例子(纯假设):

        • #美食 标签,打这个标签,可能只代表你吃过。

          • 当你自己会做这道美食时,你再打上 #菜谱 标签,它才会进入 “下厨菜谱”数据库
          • 对那些只吃过却不会做,但你认为可以用来招待亲友客人的,你再打上 #请客 标签,它就会进入“美食社交”数据库。
          • 最后,肯定还有一些虽然打上了 #美食,但你既没兴趣学烹饪,也基本不会再去光顾的,就可以让它保持静默,在日记里潜伏躺平,等待被唤醒。
        • 之所以要分不同的数据库,而非合在一个库里用不同视图来管,是因为“下厨菜谱”与“美食社交”的属性应该是截然不同的,分开两个数据库来管理,更方便,不会混乱。

      • 但如果不是上面这种涉及不同结构的数据库的情况,那还是直接用 SuperRef 吧。

  • 用法 B2 呢?我觉得,它的应用场景更广泛,也更实用。

或许该叫它:阶梯式动态数据库

  • 阶梯式动态数据库:组合标签时合并使用 OR 与 AND
    • 具体做法:某个或某些(后者应该更常用,用 OR 写入查询代码中)标签(也可以是关键词,甚至还可以标签与关键词混用),刚开始让它(们)进入 库A

    • 由此,会“自动”汇总一批加了指定标签(关键词)的记录;

    • 当你决定对其中某一条记录采取进一步行动时,再用 AND 给它追加一个进阶标签,它就会同时进入 库B

      • 这个内容块,在添加进阶标签后,会同时进入两个库——库A库B
      • 关键:库A库B 有不同的数据结构,不同的表单项和视图,承担不同的管理职能。
    • 甚至还可以进一步进入 库C……以此类推。

    • 举个我自己实践的例子:

      • 前文说了,我用 IDeas 动态数据库来同时管理 #闪念#灵感#选题

        • 其实,它们都是灵感,只是“灵”的程度有所不同。

          • 闪念:我定义为某个瞬间的想法,但我暂时没想明白它该如何拓展,乃至它的意义;又或者它暂时没有拓展的必要。
          • 灵感:更接近传统意义上的灵感,我在想到它的时候已经明了其意义,以及大致的拓展方向,只是还需要时间深入思考。
          • 选题:同样是灵感,但比较成熟,我既明了它的意义,也知道要如何拓展它,只需要时间来将它写成文章或笔记。
        • 它们的属性相同(因为本质上是一样的),有一致的数据结构。

          • 在数据库属性面板上,它们是这样呈现的:

            image

          • 它们被我同时汇总到了 IDeas 库,用不同的视图来分别管理——通过制定不同视图的筛选条件,就能实现。

      • 对于其中重要的灵感或选题,当我要立即着手来推进它时,我会再给它打上 #重要 标签。这时,这条内容会再次进入 Doing 库Doing 库会赋予它另一套与行动相关的属性。而这条内容原本的属性也依然保留着。

        • 这些属性会同时呈现在该内容块的数据库属性里,而且很有层次感。

          image

        • 在内容块本身,加上之前提到的数据库数据展示插件效果,它的呈现是这样的:

          image

      如果有必要,我还可以用同样的方法,让它继续进入第 3 个库、第 4 个库。

      • 个人觉得,这个数据库流非常 cool!至少我个人很喜欢它的实践效果,它达到了我的预期!
    • 同时,这也就实现了阶梯式的动态数据库应用

  • 阶梯式动态数据库的应用场景

    (短时间内,我能想到的有)

    • 创作类场景

      • 第一步记录思想、灵感,第二步组织行动——这是所有创作的底层模式。

      • 它们都可用阶梯式动态数据库来管理(参照我上面的实例)。

        • 比如:写作、编程、办讲座、做视频、做直播……。
    • 复杂项目场景: 也可以采用这种模式。

      因为这类项目,往往每个阶段,有不同的属性,所以不同阶段有可能需要用不同数据库来管理。

      • 比如:买房、炒股。

        • 前期看房(选股),信息是一套内容属性,你可能会记录很多房源(股票)信息。

        • 中期买房(买股),信息又有新增内容,但可能只有 1 套房子(几个股票)进入到第二个购买数据库。

          • 这时,你需要新增一套内容属性,但原属性在原来的数据库里会继续存在,你不用重复创建。
          • 新增的属性只会在第二套库里存在,不会干扰第一个库。
        • 后期装修(抛股),信息又会截然不同。

          • 这时你只要从容的建一个新库,增加一个 AND 条件,不用考虑如何优化以前的数据库了。
    • 其他……

结语

以上就是我近 2 个月内,实践 SuperRef 与动态数据库的一些粗浅心得,以及我自己想到的一些用法。附上阶梯式动态数据库的 QV 查询代码(示例中用于 Doing 数据库的),供大家参考:

//!js
const query = async () => {
    const SQL = `
        select * from blocks where (type='p' or type='d' or type='h')
        and (tag like '%#闪念#%' or tag like '%#灵感#%' or tag like '%#选题#%')
        and tag like '%#重要#%'
    `;
    let blocks = await Query.sql(SQL);
		blocks = await Query.fb2p(blocks);
    return blocks.pick('id');
}
return query();

我又有一计

如果我们在需要的时候,给 SuperRef 对应的内容块,也打上一个特定的进阶标签,让它自动关联另一个动态数据库,效果会怎样呢?

想到就做:

image

SuperRef 与动态数据库的属性面板,也融合在一起了!

image

原来如此

真相是,思源的普通数据库之间,本身就能进行这种数据库属性面板的融合。

  • 竟然今天才知道,思源的数据库竟然还有这样好用的特性。

  • 这个特性可以用在任何一种阶梯式的数据库管理上。

    • 因而,普通数据库也能够与 SuperRef 和动态数据库进行类似的融合,也就不意外了。
  • 但一些特殊数据库,主要是插件生成的数据库,有可能会融合不了。(不再展开)

结语的结语

以上,就是我个人使用 SuperRef 和动态数据库的些许心得,在此抛砖引玉。希望能给刚开始使用这两个工具的朋友一点启发;也希望更多高手达人,能分享对这两个工具的用法心得,让我也能借鉴提升。

【本文完】

  • 作品
    2 引用 • 24 回帖
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25921 引用 • 107422 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • queguaiya

    :不明觉厉

  • 记得动态数据库也要手动刷新吧,好像不够自动

    1 回复
  • YusufPeng

    学习一下

  • 应该可以加个打开文档就自动更新的选项进去。

    1 回复
  • veryzhh

    如果有这个机制,那就会方便很多。

  • Tag 的搜索也可以用 QV

    图片.png

    不过要用最新的 1.2.2 ,1.2.1 版本的搜索有点 bug。

    这个我得抽空继续深入学习,QV 感觉还没入门。
    veryzhh
  • GloR

    请教一个可能特别傻的问题,F 工具箱这个插件怎么用?下载之后找不到齿轮小图标、顶底栏找不到插件图标、单击块标没有相关菜单。。。

    image.png

    1 回复
  • PearlLin

    顶栏有图标;如果没有的话,你看看一个类似于单块拼图的图标(悬浮显示:插件),很可能是空间不够被折叠进去了。图标样式就是插件的这个黄色工具箱,右键点击则开启设置。

    这个插件如名字,就是楼上Frostime 大佬的自用工具箱,很多功能没有明确的引导说明。其使用方式可以 1. 查看大佬的主页-发帖主题去找系统阐述;2. 查看帮助说明文档,了解感兴趣的功能 3.尝试发帖询问/群聊里询问。

    2 回复
  • GloR

    谢谢大佬,找到了!

  • 我倒是觉得,应该在思源笔记中引入更多的 LLM,以 AI 来理解和管理笔记。

    而不是用树状结构来管理笔记。

    1 回复
  • Kootea

    😄 看完之后觉得我好像也没有那么多知识需要管理。

    1 回复
  • veryzhh 1

    已经有了呀,就比如我文章里推荐的 F's 工具箱。仅它这个插件,就已经在思源里实现了三种 AI 对话方式:GPT 对话,侧边栏对话,文档内对话。

    分别能不同程度地让 AI 识别文档、搜索结果或文档内上下文……

  • veryzhh

    随着笔记内容不断增加,这种需求也会增加的。

  • 思源的这类方案还是缺失了 tana “标签继承” 的优点

    1 回复
  • veryzhh

    确实没有,这是底层结构决定的吧。

    1 回复
  • 也不是,要实现也是能做到的。

  • PearlLin 1 评论

    今天又研究了一下,数据库和 sql 能打通。

    可以通过在主键块处添加标签,于是可以通过 sql 进行区分性质的查询(后续可以用上 limit、文档流);

    数据库这里,用 f 佬动态数据库里给的标签模板列,可以通过数据库自带的筛选,来实现不同界面的查看。

    我明白你的意思了,回头我也实验一下!
    veryzhh
  • Achmd

    感谢作者!很棒的文章!
    我是菜鸟,不太明白用阶梯式动态数据库做笔记的整个工作流?
    库 A -> 库 B ,该如何设置不同的数据结构,不同的属性表单项。比如:我现在在学习用思源做笔记,看了很多文章,是要在 daily note 写下摘要和自己的想法,再录入到数据库吗?最后有没有“归档”数据库呢?我试图总结出适合自己的实操的做笔记的流程或清单;又比如我学习做视频和实操方法的记录。能不能给一些模板供参考或再给些示例?多谢!

    1 回复
  • veryzhh

    关于这篇文章:

    • 阶梯式动态数据库,是动态数据库的一种用法,目的给如何发挥动态数据库的作用提供一些思路。
    • 这是一种动态数据库进阶的用法,并非必须。
      • 你可以把 SuperRef 和动态数据库,看成是内容快的附加属性的信息库。
        • 区别于内容块的元属性(如块 ID、创建时间、更新时间等)
      • 但如何添加这些附加属性,完全要看自己的需求。每个人的需求都会不一样。
    • 更有趣的一点是:这种用法在普通数据库之间也能实现
    • 是否在数据库中实现“归档”,也完全看自己的需求。
      • 它可以只是某个数据库的一个“视图”
        • 比如你给该数据库增加一个“状态”栏,假定包含:待执行、执行中、已执行三项。
        • 那就可以给所有“已执行”的主键,做一个单独的视图,通过设定筛选,让这个视图只显示“状态”为“已执行”的主键及相关信息,这就可以视为“归档”。
      • 个人觉得,完全没必要去另建一个“归档”数据库。
        • 应该遵循“如无必要,勿增实体”的原则。
        • 归档,是 PARA 的概念,更适合用于整个笔记的架构中,而非单个数据库或文档。

    对于你的疑问,我的个人建议是:

    • 先不要管 SuperRef 和动态数据库,先建立自己的笔记框架,以及基础的笔记流。
      • 基于 Daily Note 的无压笔记流,只是其中的一种,它是基于双链的。
        • 而 SuperRef 可以增强这一笔记流中汇总反链的需求。
      • 也有人不喜欢 Daily Note,而是直接构建笔记框架,比如用 PARA 框架。
        • PARA 是以项目为中心的。
        • 假如你正好有较复杂的项目需要用笔记来管理,就可参考本文中阶梯式动态数据库的应用思路。
          • 但如果对于复杂的项目管理还没有概念,那确实有可能暂时不明白我文中一些思路之所指。
          • 但没关系,你可以先剪藏,等以后实际到这一阶段,自然能从中获得启发。
      • 还有人喜欢用标签来管理笔记(而不是双链)。
        • 动态数据库或者能帮到他汇总一些重要的标签到指定的数据库。
    • 其次,你至少要对思源的数据库的应用,形成一些初步的使用习惯。
    • 当你需要增益、完善某个笔记流的环节,而 SuperRef 或动态数据库刚好能达到你的要求时,你再用它。
      • SuperRef 和动态数据库,应该是基于较成熟的笔记流的应用,目的是为了让笔记流的某个或某些环节更有效率。如果不能达到这一目的,就暂时不用。
        • 因为它一旦建立,以后又需要进行翻工调整的话,就会很浪费时间、精力。
        • 而在笔记流未明确时,先搞 SuperRef 和动态数据库,有较大概率未来要翻工。
          • 个人经历,比如关于闪念、灵感和选题,我就是翻工两次的。具体不详述了。
      • 只有当你明确用它们来做什么对你有益时,再用它,效率才是最高的。

    至于例子,可参考我文中前后两次给出的关于用数据库来汇总整理“闪念”、“灵感”、“选题”的例子,已基本呈现了我的这一思维链在笔记中的发展历程。仅供参考。

    1 回复
    2 操作
    veryzhh 在 2025-05-23 13:29:33 更新了该回帖
    veryzhh 在 2025-05-23 13:02:54 更新了该回帖
  • Achmd

    谢谢你的长文回复。

  • Achmd

    能告诉一下你使用的主题和 Daily Note 模板吗?多谢!

    1 回复
  • GloR

    谢谢回复,已经找到啦~

  • Imuvux

    又看了一遍,感觉和 Anytype 有很多共通理念。个人理解核心在于属性、视图解耦,查询作为接口。

  • veryzhh

    主题是 QYL,Daily Note 模板是自己做的。

    话说,我没展现我的 Daily Note 吧?

    如果你是问反链里的时间戳是怎么回事,那用的是叶归插件里的 Lifelog 格式。

请输入回帖内容 ...