数据表设计
一、概述
eos在执行一个action之前,会为该action设置一个干净的运行环境,也就是说每个action是完全独立的环境中运行的,目前在action之间传输数据的唯一方式是持久化数据到eos数据库和从eos数据库读取数据。
eos标准库中multi_index api提供了一个访问eos数据库的C++接口,这个API提供了一个对象存储的模型,支持多种检索方式、支持不同排序方式的多索引、支持访问权限控制。其使用便利性等同于传统表、行、列、索引数据库,其API类似于boost multi-index容器api,因为其设计就是基于boost multi_index容器而来。
mulit_index从概念上可以被视为传统数据库中的表格,其中行是容器中单个对象,列是容器中对象的成员属性,索引是对象的某个成员属性,通过这个键值可以快速查找对象。
传统数据库表允许索引是表中某些列的用户自定义函数,multi_index容器提供了类似的功能,允许索引是用户自定义函数,但返回值类型必须是数据库键支持的数据类型。
传统数据库表通常有一个唯一的主键,它允许明确标识表中的特定行,并为表中的行提供排序,multi_index也支持类似的语义,但multi_index容器中对象的主键必须是唯一的无符号64位整数,multi_index容器中的对象按主键索引进行升序排序。
multi_index是eosio持久性服务的关键实现,可以定义一个主键和最多可以定义16个二级索引,multi_index也支持C++的迭代器。
二、如何创建表
以下是使用eos创建多索引表的步骤:
1. 定义对象类型struct/class,每个对象都将位于创建的multi_index表中
2. 在对象类型中定义一个成员函数primary_key,返回uint64_t作为主键值
3. 确定二级索引,最多支持16个二级索引,二级索引支持以下列出的几种数据类型:
idx64
idx128
idx256
idx_double
idx_long_double
4. 为每个二级索引定义一个键提取器,用于从索引表中获取键值。
三、使用表
1. 实例化多索引表
2. 根据合约要求,添加(emplace)、修改(modify)、删除(erase)对象
3. 查询对象(get/find)、迭代器操作
四、表设计示例
在以下示例中,介绍如何使用eos的multi_index API实现汽车维护跟踪器,跟踪器将保存车辆维护活动记录。
该跟踪器的目标用户是车辆维护服务机构以及客户即车辆拥有人,一旦车辆维护服务工作完成,服务工人会将该维护活动记录