摘要
表格存储(TableStore)是构建在阿里云飞天分布式系统之上的 NoSQL 数据存储服务,提供海量结构化数据的存储和实时访问,数据读写是表格存储产品化最重要的功能之一。
本文首先介绍了表格存储原有的数据读写工具及不足之处,接着介绍了表格存储的数据模型,然后对控制台的数据读写功能进行了详尽的阐述,最后对控制台的数据读写功能进行了总结和展望。
背景
在创建数据表之后,用户可以通过调用 RESTful API,使用针对主流语言的 SDK 工具包、命令行界面、客户端工具等方式执行读写数据的操作。使用API或SDK方式,需要用户根据业务场景进行代码编写,提高了用户的使用门槛,降低了用户的体验。命令行工具和客户端工具为驻云开发,已经不再进行版本迭代,无法根据用户的反馈做出体验和功能上的优化。而且,无论使用哪种方式,都会将控制台的实例/表等操作和数据读写割裂开来,用户需要在控制台和数据读写工具之间来回的切换,大大降低了用户的使用体验。诸多问题的根源在于控制台上缺乏数据读写功能。
通过表格存储官网API文档,我们不难发现,表格存储的数据读写包括有单行数据操作(GetRow、PutRow、UpdateRow、DeleteRow)和多行数据操作(GetRange、BatchGetRow、BatchWriteRow)。控制台的数据读写在这些API定义的基础进行开发,旨在给用户提供一体化的轻量级数据操作。
TableStore数据模型
表格存储的数据模型概念包括表、行、主键和属性,如下图所示。
- 表是行的集合,行由主键和属性组成。
- 主键列和属性列均由名称和值组成。
- 所有行都必须包含主键列,其主键列的数目和名称必须相同。
- 每行包含的属性列的数目可以不固定,名字和数据类型也可以不同。
- 与主键列不同,每个属性列可以包含多个版本,每个版本号(时间戳)对应一个列值。
说明:时间戳是从 1970-01-01 00:00:00 UTC 时间到当前写入时间的毫秒数。
读写管理功能简介
登陆官网控制台后,用户可以通过数据表列表的数据管理操作来进入数据读写操作页面。控制台的数据读写包含有数据插入、数据查询、数据更新和数据删除四个部分,后文将对各个部分进行详细介绍。
数据查询
数据查询包括单行查询和范围查询,分别与API定义中的GetRow和GetRange相对应。当用户进入数据管理页时,控制台会进行一个默认的范围查询操作。范围查询结果包含主键列和属性列,其中,主键列最多显示四列(Table本身的限制), 属性列最多显示20列。对于查询到的具体的值而言,由于单一主键列的列值大小上限为1KB,主键列显示的是完整的数据。而属性列的上限为2MB, 出于响应性能考虑,属性列截取20个字符单元(汉字、字母都算一个字符单元)显示。在属性列中,我们也为用户专门设计了多版本数据的展示,用户只要移动到属性列数据下面,即会有悬浮窗口展示多版本数据。
技术注解:
- 属性列最多显示20列,20列主要是出于响应性能的考虑,属性列显示过多,会直接导致传输的数据量增加。
- 属性列最多显示20列是指,对于查询到的所有行的属性列集合,依据属性列的名称选取字符序最小的前20列。
- 单行查询时,不会做属性列数的限制,返回的属性列数和GetRow接口返回的保持一致。
在点击查询数据按钮后,用户可以进行自定义的范围查询和单行查询。在范围查询时,会提前填写好一些预设值,用户可以直接进行正序查询,查询完成后会最多显示20行属性列。单行查询时,需要用户添加要查询的主键列,方可进行查询,特别的,在查询这块功能,我们会主动帮用户记录上次查询的一些记录,以优化用户的使用体验。
查询功能包括以下一些功能点:
自定义查询属性列
范围查询会默认帮用户显示前20列,当然用户也可以自定义所需查询的属性列, 如下图所示,用户可以便捷的进行属性列的添加和删除操作。自定义每页显示行数
目前支持每页显示10条、20条和50条。- 自定义版本号范围
当指定最大版本号MaxVersion时,查询后,会显示版本数为1~ MaxVersion的属性列数据。
当自定义版本号范围[MinVersion, MaxVersion]时,会显示版本数为MinVersion ~ MaxVersion的属性列数据。 - 正序逆序查询(范围查询)
- 自定义主键查询范围(范围查询)
主键查询支持最大值,最小值和自选输入的选择。表格存储表中的行按主键进行从小到大排序,范围查询的读取范围是一个左闭右开的区间。操作会返回主键属于该区间的行数据,区间的起始点是有效的主键或者是由 INF_MIN 和 INF_MAX 类型组成的虚拟点,虚拟点的列数必须与主键相同。其中,INF_MIN 表示无限小,任何类型的值都比它大;INF_MAX 表示无限大,任何类型的值都比它小。更多关于主键排序的规则可以参见文章 表格存储数据模型和查询操作。
在用户填写好所有的相关参数后,若查询按钮可用(代表参数格式都合法)后,用户点击后,即可查询到相应的数据。
数据插入
用户在点击插入数据按钮后,即可进行数据插入,数据插入对应到API定义中的PutRow操作。插入数据时,用户需要填写好需要插入的主键列,并点击添加属性列按钮进行属性列的添加,目前属性列支持Integer, String, Double和Boolean类型,Binary类型的支持将在后续的版本迭代中更新。对于数据版本而言,支持用户自定义版本号和使用服务器端系统时间两种,用户自定义版本号需要在合理的范围内。为了方便用户便捷的进行属性列的更新,我们提供有单行属性列的添加和删除,移除所有属性列(若存在需要添加的属性列时)。
特别说明:
- 写入数据所有属性列的版本号与写入时时间的差值需要在数据有效版本偏差范围之内,否则将会写入失败。
当用户填写好所需插入的信息后,点击确定插入按钮,若插入成功,会在右上角提示插入成功,并会立刻在数据表格中显示刚插入的行。为了优化用户的使用体验,我们会主动帮用户记录上一次执行数据插入的相关主键列和属性列列表,这样就能更快的完成插入数据操作。
数据更新
用户刚进入数据管理页面时,更新数据按钮为不可用状态,用户在勾选中某一行数据后,更新按钮将会变得可用。点击更新数据按钮后,即可进行当前行的数据更新, 数据更新与API定义中的UpdateRow相对应。
在数据更新时,我们会为用户预先加载选中行的所有属性列,为了方便用户便捷的进行属性列的更新,我们同样提供有单行属性列的添加和删除,移除所有属性列。对于单个属性列的更新操作,更新类型包括PUT(语意为如果该列不存在,则新增一列;如果该列存在,则覆盖该列), DELETE(语意为删除该列特定版本的数据)和DELETE_ALL(语意为删除该列所有版本的数据)。特别的,在DELETE更新类型时,我们还会预先帮用户加载当前属性列所有的版本号以供用户选择。而对于属性列类型而言,目前支持Integer, String, Double和Boolean。
特别说明:
- 预先加载的属性列为前端显示的属性列,并不会再往后端发送新的GetRow请求。
当用户填写好所需更新的信息后,点击确定更新按钮,若插入成功,会在右上角提示更新成功,并会立刻在数据表格中显示刚插入的行。
数据删除
用户刚进入数据管理页面时,删除数据按钮为不可用状态,用户在勾选中大于一行数据后,删除按钮将会变得可用。删除数据使用了API定义的BatchWriteRow, BatchWriteRow 操作可视为多个 PutRow、UpdateRow、DeleteRow 操作的集合。各个操作独立执行,独立返回结果,独立计算服务能力单元。与执行大量的单行写操作相比,使用 BatchWriteRow 操作可以有效减少请求的响应时间,提高数据的写入速率。
用户在点击确定删除按钮后,若批量删除成功,会在右上角提示删除成功,并会立刻进行一次默认的范围查询操作,并显示在数据表格中。
总结
本文在分析表格存储原有数据读写工具不足之处的基础上,引入了控制台数据读写功能的介绍, 并对数据读写功能的详细功能进行了阐述。使用控制台的数据读写功能,用户可以很容易的对数据进行轻量级的读写操作,但是从整体上来看,控制台读写仍存在一些不足之处。从功能上看,不支持Binary类型的数据读写操作,不支持过滤器和条件更新等高级操作,从体验上看,出于响应性能考虑做了一些限制,比如行列数限制,属性列截取等,有可能会造成查询不到预期的数据。我们也将在未来的版本迭代中,对数据读写进行功能上的完善和体验上的优化。
更多的应用场景和技术探讨,欢迎加入我们的钉钉交流群(群号:11789671)。