psql_dos 格式#

PsqlDosBackend 是存储 provenance 数据的主要格式。它将数据存储在两个位置:

  1. A PostgreSQL 数据库。

  2. disk-objectstore 存储库(见 磁盘对象存储 (disk object store))。

数据库存储了所有的实体数据,组织成不同的表格(与 AiiDA ORM 实体密切相关)和列/字段。node 所需的较大二进制数据(如输入/输出文件内容)存储在 disk-objectstore 中,并作为虚拟 file-system 被 db_dbnode.repository_metadata 引用。

使用 sqlalchemy ORM API 可实现与数据库的对接。

PostgreSQL 数据库模式#

下一节提供了 PostgreSQL 数据库的完整模式。

表格#

在所有表中,唯一标识每个成员的主键是 id 字段中的一个正整数。但是,这个数字在表内是唯一的,因此在同一个数据库中,可能存在一个 id 为 2 的用户和一个 id 为 2 的 node (或者,更简单地说,两个 id 为 2 的 node 在不同的数据库中)。

大多数实体也有一个 uuid 值。uuid 是全球所有 AiiDA 数据库表中唯一的标识符。这是一个 32-position 十六进制序列,以字符串形式存储,其中包含一些破折号分隔的部分(例如:479a312d-e9b6-4bbb-93b4-f0a7174ccbf4)。

备注

  • * 表示具有唯一约束的列

  • 指示外键

  • ? 表示可归零的值类型。

    sqla-model:: ~aiida.storage.psql_dos.models.user.DbUser sqla-model:: ~aiida.storage.psql_dos.models.node.DbNode sqla-model:: ~aiida.storage.psql_dos.models.node.DbLink sqla-model:: ~aiida.storage.psql_dos.models.group.DbGroup sqla-model:: ~aiida.storage.psql_dos.models.group.DbGroupNode sqla-model:: ~aiida.storage.58sqla-model:: ~aiida.storage.psql_dos.models.computer.DbComputer sqla-model:: ~aiida.storage.psql_dos.models.authinfo.DbAuthInfo sqla-model:: ~aiida.storage.psql_dos.models.comment.DbComment sqla-model:: ~aiida.storage.psql_dos.models.log.DbLog sqla-model:: ~aiida.storage.psql_dos.models.settings.DbSetting

many-to-one 的关系#

您可以看到用户和 node 之间关系为 many-to-one 的示例:每个 node 都有一个且仅有一个创建它的用户,而一个用户可能创建了许多 node。虽然在这种情况下关系是 “mandatory”,但情况并不一定如此:例如,并不是所有的 node 都有计算机,但有计算机的 node 只有一台,没有更多。

以下实体具有 many-to-one 关系:

  • 同一个 user 可以创建多个 nodes

  • 许多 nodes 可以指向同一个 computer

  • 同一个 user 可以创建多个 groups

  • 同一个 user 可以设置多个 authinfos

  • 同一个 computer 可以设置多个 authinfos

  • 同一个 user 可以创建多个 comments

  • 同一 node 可连接多个 comments

  • 同一 node 可连接多个 logs

跟踪这些关系的方法是在 “many” 实体的表中插入一个 外键``列,指向与之相关的 "one" 实体的相应 id 值。例如,在**db_dbnode**表中有一个 ``user_id 外键列,其中存储了创建每个 node 的用户的 id。

many-to-many 关系#

这种类型的关系比较难以跟踪,因为现在两个成员都可能与不止一个元素相关。如果将其记录在与其中一个实体相同的表中,就意味着要在列中存储一个值列表(通常不鼓励这样做,也不支持这样做)。因此,更方便的做法是使用一个额外的表,其中每个连接都有相应的条目,指明相关的具体元素。

AiiDA 中只有两个 many-to 多关系:

组与 nodes 之间

如前所述,同一个组内可以有多个 node,一个 node 可以属于多个不同的组。这种关系在 db_dbgroup_dbnodes 表中进行跟踪。

nodes 本身之间(链接)

node 具有所谓的 “self-referencing relationship”,这意味着它们之间可以相互连接。事实上,这是 provenance 图形工作的核心原则之一。这种关系在 db_dblinks 表中有记录。

存储 schema 迁移#

存储 schema 的迁移由 PsqlDosMigrator 使用 alembic 实现,以便与 aiida-core API 的更新保持一致。

传统 schema#

psql_dos 存储格式源于 aiida-core 第 1 版中的 djangosqlalchemy 后端合并。这两个后端都有非常相似的 PostgreSQL 数据库 schema,现在有两个独立的迁移分支将它们合并为一个 schema。