基于 Domino 平台的开发过程中,我们经常会用到各种 ID,如 UNID、Note ID、复本 ID 等等。本文简要介绍各种 ID 的组成以及用途。
在开始之前,我们首先来分析一下文档属性对话框-标识符标签中的各部分。以如下数据为例:
OF0000039D:3836C29F-ON85255DC9:0056FB94
SD00255DF4:0057B8FA-SN00000003
DB85255CD9:00567287-NT0000C092
其中红色部分为数据名称的简写,其余部分才是数据本身。各部分含义如下:
OF : Originator ID.File
虽然名字叫 File,其实是个完完全全的随机数(唯一),与数据库文件没有任何关系 – –
ON : Originator ID.Note
Note(可理解为文档,实际为文档、设计元素、ACL等。下同)最初的创建日期及时间
SD : Sequence Datetime
Note 的修改日期及时间
SN : Sequence Number
Note 的修改序列号,每修改一次加一
DB : Database ID
数据库的创建日期及时间
NT : Note ID
Note 在 Record Relocation Vector (RRV) 中的位置,可以理解为在数据库文件中的位置偏移
接下来我们再介绍各种常见的 ID 由以上哪些部分组成。
UNID(Universal ID, Unique ID) = OF+ON。UNID 是我们最常用的文档标识,它不随着文档的修改而改变。同一个文档在各个复本中具有相同的 UNID,反过来它也是确定两个文档是否为复本的根据。新建数据库拷贝后 UNID 也不变。编程过程中可以通过 getDocumentByUNID 方法来获取文档,在浏览器中也可以通过 db.nsf/view/UNID 的方式访问文档。根据我的测试,@Created 公式返回的值就是 ON 这个部分。
Note ID = NT。它也不随着文档的修改而改变,但是在不同的副本、新建数据库拷贝中,Note ID 可能与原数据库中的不同。编程过程中可以通过 getDocumentByID 方法来获取文档。
Replica ID = DB。复本 ID 用来识别两个数据库是否具有复本关系,除此之外复本 ID 还经常用来作为数据库的唯一标识,如浏览器中可以用复本 ID 代替数据库路径来访问文档、视图等。
Originator ID(OID) = UNID + SD + SN。OID 我们一般很少接触,因为它是用于后台的复制任务。复制过程大概如下(以数据库 A 向具有复本关系的数据库 B 发起单向复制为例):
- 从 A 的复制历史中找到与 B 完成最后一次复制的时间
- 在 A 中搜索在此时间之后新建及修改的文档,返回一组 OID 值
- 使用上一步返回的 OID 中的 UNID 部分作为条件,在 B 中查找文档,返回 OID 值
- 如果查找不到,则该文档视为新建的,添加到 B 中
- 如果两个 OID 相同,则两个文档已经同步,视为不需要复制
- 如果两个 OID 不同,则两个文档不同步,通过分析 $Revisions 域值判断是否存在冲突,通过 $ConflictAction 域判断是否合并冲突,通过分析 SD 和 SN 决定哪个将作为冲突文档(此过程较复杂,如果大家感兴趣,可以另开一篇文章讨论)
请参考:Anatomy of a Note ID