========================= MGE数据存储格式 ========================= 数据存储主要包括材料类别管理、模板管理、数据管理这几个功能,对应 `storage` 这个 app。 Template 模板 --------------- 模板结构 ~~~~~~~~ +-------------+-----------+---------------------------------------------------------------------+ | 字段名 | 类型 | 说明 | +=============+===========+=====================================================================+ | `id` | Integer | 类别 id,自增类型 | +-------------+-----------+---------------------------------------------------------------------+ | `title` | Char(255) | 模板标题,标题不能重复 | +-------------+-----------+---------------------------------------------------------------------+ | `category` | 外键 | 所属材料类别,引用`MaterialCategory` | +-------------+-----------+---------------------------------------------------------------------+ | `author` | Char(32) | 创建者名字,对应 account 中的用户名(作者可以不存在,不作校验) | +-------------+-----------+---------------------------------------------------------------------+ | `abstract` | Char(512) | 简要介绍,包括模板内容、功能、作用等 | +-------------+-----------+---------------------------------------------------------------------+ | `ref_count` | Integer | 引用计数,即使用这个模板的数据的数目 | +-------------+-----------+---------------------------------------------------------------------+ | `pub_date` | Date | 创建日期 | +-------------+-----------+---------------------------------------------------------------------+ | published | Boolean | 是否已发布 | +-------------+-----------+---------------------------------------------------------------------+ | trashed | Boolean | 是否已删除,当数据计数不为零时,删除仅将此值设置为 true,不实际删除 | +-------------+-----------+---------------------------------------------------------------------+ | `content` | JSON | 模板内容,一个复杂的字典类型数据,详见文档示例 | +-------------+-----------+---------------------------------------------------------------------+ 模板content示例 ~~~~~~~~~~~~~~~ .. sourcecode:: JSON { "_ord": ["string", "number", "range", "image", "file", "choice", "array", "table", "container", "generator"], "string": {"t": 1, "r": true, "misc": {}}, "number": {"t": 2, "misc": {"unit": "v"}}, "range": {"t": 3, "misc": {"r_type": 0, "lb": 1, "ub": 10, "unit": null}}, "image": {"t": 4, "misc": {"multi": false}}, "file": {"t": 5, "r": true, "misc": {"multi": true}}, "choice": {"t": 6, "misc": { "opt": ["opt1", "opt2", "..."], "grp": [{"name": "grp1", "items": ["1", "2", "3", "..."]}, {"name": "grp2", "items": ["a", "b", "c", "..."]}] }}, "array": {"t": 7, "misc": {"t": 3, "misc": {"r_type": 1, "val": 10, "err": 10, "unit": "A"}}}, "table": {"t": 8, "misc": { "_head": ["head1", "head2", "..."], "head1": {"t": 1, "r": false, "misc": {}}, "head2": {"t": 2, "misc": {"unit": null}}, "...": {"t": 1, "misc": {}} }}, "container": {"t": 9, "misc": { "_ord": ["field1", "field2", "..."], "field1": {"t": 1, "misc": {}}, "field2": {"t": 1, "misc": {}}, "...": {"t": 1, "misc": {}} }}, "generator": {"t": 10, "misc": { "_opt": ["opt1", "opt2", "..."], "opt1": {"t": 1, "misc": {}}, "a": {"t": 1, "misc": {}}, "...": {"t": 1, "misc": {}} }} } 模板字段格式 ~~~~~~~~~~~~~ 所有模板字段包含type和misc两个字段,type为字段类型,misc为该字段其它内容。 基本格式形如下: .. sourcecode:: JSON { "fieldname": { "t": 0, "r": true, "misc": { "otherkey": "othervalue" } } } 其中 t 必须设置,r 如果为true则一定要设置,否则可以设置 false ,也可以没有这个字段。 misc如果为空,则可以是空的 dict,也可以完全没有这个字段。 字段类型(类型值全部定死) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------+----------+ | 字段名 | 字段类型 | +==========+==========+ | 字符串型 | 1 | +----------+----------+ | 数值型 | 2 | +----------+----------+ | 范围型 | 3 | +----------+----------+ | 图片型 | 4 | +----------+----------+ | 文件型 | 5 | +----------+----------+ | 候选型 | 6 | +----------+----------+ | 数组型 | 7 | +----------+----------+ | 表格型 | 8 | +----------+----------+ | 容器型 | 9 | +----------+----------+ | 生成器型 | 10 | +----------+----------+ 具体的misc的内容根据字段类型区分,见下方说明,r字段不再说明。 1. 字符串型 一个字符串型数据。 文本型type定义为 1,misc为空值 +--------+------+--------------------+ | 字段名 | 类型 | 说明 | +========+======+====================+ | t | int | 文本型数据类型为 1 | +--------+------+--------------------+ | misc | dict | 空的,{} | +--------+------+--------------------+ 2. 数值型 一个数值型数据,包括BSON里面的int、long、double、decimal类型的数值。 数值可以设定有单位或无单位。 数值型的type定义为 2,misc仅包含一个 *unit* 字段。 +-----------+--------+----------------------------------------+ | 字段名 | 类型 | 说明 | +===========+========+========================================+ | t | int | 数值型数据类型为 2 | +-----------+--------+----------------------------------------+ | misc.unit | string | 数据单位,如果无单位则为空字符串或null | +-----------+--------+----------------------------------------+ 3. 范围型 一个数值范围,包括区间型 *[a, b]* 和误差型 *a ± b* 两种形式。 范围型数据可以设定有单位或无单位。 具体的: +-----------+--------+--------------------------------------------+ | 字段名 | 类型 | 说明 | +===========+========+============================================+ | type | int | 范围型数据类型为 3 | +-----------+--------+--------------------------------------------+ | misc.unit | string | 数据单位,如果无单位则为空字符串或`null` | +-----------+--------+--------------------------------------------+ | misc.type | int | 范围值类型,0表示区间型,1表示误差型 | +-----------+--------+--------------------------------------------+ | misc.lb | number | 范围值区间型下区间(若为误差型则无此字段) | +-----------+--------+--------------------------------------------+ | misc.ub | number | 范围值区间型上区间(若为误差型则无此字段) | +-----------+--------+--------------------------------------------+ | misc.val | number | 范围值误差型值(若为区间型则无此字段) | +-----------+--------+--------------------------------------------+ | misc.err | number | 范围值误差型误差值(若为区间型则无此字段) | +-----------+--------+--------------------------------------------+ 4. 图片型 图片型的type定义为 4,misc仅包含 *multi* 字段,默认每张图片都需要描述信息。 +------------+------+----------------------+ | 字段名 | 类型 | 说明 | +------------+------+----------------------+ | type | int | 图片型数据类型为 4 | +------------+------+----------------------+ | misc.multi | bool | 指定是否允许多个图片 | +------------+------+----------------------+ 5. 文件型 文件型的type定义为 5,misc仅包含 *multi* 字段,默认每个文件都需要描述信息。 +------------+------+----------------------+ | 字段名 | 类型 | 说明 | +============+======+======================+ | type | int | 文件型数据类型为 5 | +------------+------+----------------------+ | misc.multi | bool | 指定是否允许多个文件 | +------------+------+----------------------+ 6. 候选型 候选型相当于下拉列表,前端相当于 select 标签,可以有选项分组,即 optgroup。 +----------+-------+------------------------------------------------------------------------------------------------------+ | 字段名 | 类型 | 说明 | +==========+=======+======================================================================================================+ | type | int | 候选型数据类型为 6 | +----------+-------+------------------------------------------------------------------------------------------------------+ | misc.opt | array | 候选项数组,全部为字符串类型,不包含分组部分。 | +----------+-------+------------------------------------------------------------------------------------------------------+ | misc.grp | array | 候选项分组名称数组,仅包含该分组组名。格式为[{"name": "name", "items": ["value0", "value2", "..."]}] | +----------+-------+------------------------------------------------------------------------------------------------------+ 7. 数组型 此处数组型仅表示一维数组。 +--------+------+---------------------------------------------------+ | 字段名 | 类型 | 说明 | +========+======+===================================================+ | type | int | 数组型数据类型为 7 | +--------+------+---------------------------------------------------+ | misc | dict | misc对应处定义的其它9种类型(除表格型和数组型外) | +--------+------+---------------------------------------------------+ 8. 表格型 表格型包含表头和数据部分,直观上数据部分仅为数值和文本两种类型,原则上表格型不能有多级嵌套。 **表格型仅能添加123456 类型数据。45类型即图片和文件类型默认不允许多个文件。** +----------------+--------+--------------------------------------------+ | 字段名 | 类型 | 说明 | +================+========+============================================+ | type | int | 表格型数据类型为 8 | +----------------+--------+--------------------------------------------+ | misc.\_head | array | 每一列的列名的数组 | +----------------+--------+--------------------------------------------+ | misc.\[head0\] | object | 对应列的数据类型(其它列相同,此处不列出) | +----------------+--------+--------------------------------------------+ 9. 容器型 容纳所有字段,相当于MongoDB的一个document,对于用户来说相当于属性分组。 +-----------------+--------+----------------------------------------------------------------------------+ | 字段名 | 类型 | 说明 | +=================+========+============================================================================+ | type | int | 容器型数据类型为 9 | +-----------------+--------+----------------------------------------------------------------------------+ | misc.\_ord | array | 容器中出现的各个字段的名字的数组 | +-----------------+--------+----------------------------------------------------------------------------+ | misc.\[field0\] | object | 对应字段的属性信息,值可以为任意类型的模板字段(其它字段相同,此处不列出) | +-----------------+--------+----------------------------------------------------------------------------+ 10. 生成器型 生成器型容器型的键值对集合,也就是候选型与容器型的组合,用于按照名称生成对应容器型数据。 +---------------+--------+---------------------------------------------------+ | 字段名 | 类型 | 说明 | +===============+========+===================================================+ | type | int | 生成器型数据类型为 10 | +---------------+--------+---------------------------------------------------+ | misc._opt | array | 候选项数组,全部为字符串类型。选项不能重复 | +---------------+--------+---------------------------------------------------+ | misc.\[opt0\] | object | 选项和类型对应的dict (其它字段相同,此处不列出) | +---------------+--------+---------------------------------------------------+ Material Category & Tag 材料分类与标签 --------------------------------------- 材料分类结构 ~~~~~~~~~~~~ +-----------+-----------+----------------------------------------------------+ | 字段名 | 类型 | 说明 | +===========+===========+====================================================+ | `id` | Integer | 类别 id,自增类型 | +-----------+-----------+----------------------------------------------------+ | `parent` | 外键 | 引用到自身 | +-----------+-----------+----------------------------------------------------+ | `level` | int | 层级值,从 0 开始,有一个全局根节点,实际的从1开始 | +-----------+-----------+----------------------------------------------------+ | `name_zh` | Char(255) | 类别中文名称,同一层级类别名称不能相同 | +-----------+-----------+----------------------------------------------------+ | `name_en` | Char(255) | 类别英文名称,同一层级类别名称不能相同 | +-----------+-----------+----------------------------------------------------+ | `leaf` | bool | 是否为叶节点 | +-----------+-----------+----------------------------------------------------+ 材料标签结构 ~~~~~~~~~~~~ +---------+----------+----------------------+ | 字段名 | 类型 | 说明 | +=========+==========+======================+ | `id` | Integer | 类别 id,自增类型 | +---------+----------+----------------------+ | `name` | Char(32) | 标签名称 | +---------+----------+----------------------+ | `count` | Integer | 使用此标签的数据数目 | +---------+----------+----------------------+ 数据格式 --------- 数据元数据结构 ~~~~~~~~~~~~~~ +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | 字段名 | 类型 | 说明 | +============+==========+===================================================================================================================================+ | `id` | Integer | 类别 id,pgsql AutoField | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `title` | Char | 数据标题 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `category` | 外键 | 数据所属类别,引用到`MaterialCategory` | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `source` | JSON | 嵌入式文档型,包含来源、支撑项目、引用文献、其它四个字段信息 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `tid` | Integer | 所使用的模板的id,这里没有使用外键,需要设置值 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `keywords` | Array | 数据关键词,即标签,直接存储文字而不引用到 MaterialTag,第一次创建数据事初始化所有tag,今后使用 `add_tags`和`remove_tags`方法更新 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `score` | Float | 数据质量,默认为 0,系统会更新其值 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `doi` | Char | doi | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `abstract` | Char | 摘要信息 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `purpose` | Char | 数据目的 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `author` | Char | 直接存储用户名而不引用到 User | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `add_time` | DateTime | 创建时自动赋值 | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ | `dc_id` | Char | 对应 mongodb 中的 `DataContent` 字段的 ObjectId | +------------+----------+-----------------------------------------------------------------------------------------------------------------------------------+ 数据内容结构 ~~~~~~~~~~~~~ 数据内容字段格式 ~~~~~~~~~~~~~~~~ 1. 文本型 文本型数据直接存储在所属document,不单独存储。 2. 数值型 数值型数据在存储时直接存储在所述document,不单独存储。单位不存储。 比如 temperature 值为 10,单位为℃,湿度为20,无单位,则存储为: .. sourcecode:: JSON { "temperature": 10, "humidity": 20 } 3. 范围型 范围型数据存储时存储上下区间或值与误差。单位不存储。 **示例:** .. sourcecode:: JSON { "temperature": { "lb": 0, "ub": 12 }, "humidity": { "val": 10, "err": 5 } } 4. 图片型 图片型引用到图片型字段,存储结果为对应的ObjectId。 5. 文件型 图片型引用到图片型字段,存储结果为对应的ObjectId。 6. 候选型 文本型数据直接存储在所属document,不单独存储。 7. 数组型 数组型为一个list,存储的内容跟其类型对应。 8. 表格型 表格型数据需要单独存储,存储结果为对应的 ObjectId。 9. 容器型 容器型数据需要单独存储,存储结果为对应的 ObjectId。 .. sourcecode:: javascript { "_t": 9, "val": ObjectId("12345678909876543212345") } 10. 生成器型 生成器类型存储方式跟其字段对应的类型有关,可能是混杂型,包含`sel`和`val`两个字段。 .. sourcecode:: JSON { "_t": 10, "_n": "selected option name", "val": "value of selected...." }