[官文翻译]Dart轻量超快键值数据库Hive - 最佳实践

996 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情


原文链接:

pub: hive | Dart Package (flutter-io.cn)

pub译文: [译]纯Dart键值(对象)数据库hive - 掘金 (juejin.cn)

译时版本: hive 2.1.0


建模数据

Hive 没有查询语言,只对排序有有限的支持,这不一定算是缺点,就像在性能基准中所见的内容。 如果在 Dart 中进行排序或过滤,会更快。

因为键值存储的确简单,数据可以用并不复杂的方式建模,例如,和 Sqlite 相比较。 这里没有 Schema,可以在相同的 box 中存储不同类型的对象。但是有些事项要意识到:

键顺序

所有的键默认以词典编纂的方式存储。可以用来『自由』排序。例如,如果想将用户排序,可以使用 姓+唯一数字 作为键,这样就可以用姓来排序。

也可以提供自定义的键排序函数。例如,可以用反转的词典编纂顺序排序用户。

列表和自增

如果想存储项目的列表,有两个选项。直接将列表存储为值(使用 put('myKey', [1, 2, 3])),或者可以分别存储每个项目(使用 add(1) 、 add(2) 等)。

如果想要存储频繁更新的大列表(例如,消息列表),应该分别存储单个项目。否则,更改一个项目时需要对整个列表进行写处理。

过滤项目

在 box 中过滤项目很容易。例如:

var filteredUsers = userBox.values.where((user) => user.name.startsWith('s'));Copy to clipboardErrorCopied

缓存结果用来改善性能是个好想法。


什么时候使用 Hive

什么时候使用 Hive

Hive 非常高效,因为和关系数据库相比,它的开销很小。API 非常接近数据在磁盘上的存储方式。 键值数据库几乎可用于存储所有类型的数据。例如:

  • 用户档案
  • Session信息
  • 文章/博客 评论
  • 消息
  • 购物车内容
  • 产品分类
  • 二进制数据

当需要跨平台支持时,Hive 也是最好的选项之一。不需要包含二进制,并且在浏览器上使用 IndexedDB 。

如果在使用 shared_preferences 包,并且不需要从原生代码中访问它们,那么应该取而代之始终使用 Hive。

什么时候不使用 Hive

在 Hive 中,当数据被正确地建模时,所有种类的数据都可以被存储。这就是说,有时候,用关系数据库如 SQlite 可能会更加方便(更方便,而不是更快!)。

特别是如果数据有复杂的关系并且对于下标和复杂查询有重度依赖的话,应该考虑使用 SQLite 。

因为 Hive 如此轻量,然后几乎不会增加应用的大小,所以可以同时使用 Hive 和其它解决方案。