psql_dos
格式#
PsqlDosBackend
是存储 provenance 数据的主要格式。它将数据存储在两个位置:
A PostgreSQL 数据库。
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 版中的 django 和 sqlalchemy 后端合并。这两个后端都有非常相似的 PostgreSQL 数据库 schema,现在有两个独立的迁移分支将它们合并为一个 schema。