繁体   English   中英

在房间数据库中存储复杂数据类型的替代方法

[英]Alternate approach to storing complex data types in room database

现有方法:目前我们使用TypeConverters来帮助数据库存储和检索复杂数据类型(POJO class 对象)。 但这涉及对象的序列化和反序列化,当我们只需要一个简单的原始数据类型如 int、string、float 等时,这似乎是不必要的。

我的方法:我正在考虑一种将复杂数据类型分解为原始数据类型并创建单独的列来存储它们的方法。 当我们需要从数据库中获取一个简单的原始类型时,我们就不必通过反序列化复杂对象的过程 go 了。

我已经尝试了我的方法并且它正在工作,但我不确定在大型项目中实施这种方法时可能出现的极端情况。

我对此还是陌生的,需要帮助来找出我的方法的优缺点。

有些人提倡将对象的表示形式存储为单个列。 如果您只想存储和检索对象然后使用这些对象,这很好。 代码本身通常可以更短。

如果您想通过 SQLite 的功能来操纵表示中嵌入的基础值(对象中的字段),那么事情会变得非常复杂并且可能效率低下,因为由于可能缺乏可用/可用的索引。

例如,如果 myvalue 是表示(通常是 JSON)中的一个值,那么要查找具有该值的行,您将不得不使用类似

@Query("SELECT * FROM the_table WHERE the_one_for_many_values_column LIKE '%myvalue%'")

或者

@Query("SELECT * FROM the_table WHERE instr(the_one_for_may_values_column,'myvalue')

而不是将 myvalue 存储在它自己的列中(比如 the_value)然后

@Query("SELECT * FROM the_table WHERE the_value LIKE 'myvalue')
  • 前两个有一个缺陷,如果 myvalue 存储在表示中的其他地方,那么该行也包括在内。 除了 LIKE 与大小写无关之外,第三个是 EXACT。
  • the_value 列上的索引可以提高性能

此外,表示无疑会增加膨胀(值的分隔符和描述符),因此需要更多存储空间。 由于相同的数据通常会被存储多次,而规范化的关系方法可能只存储数据的一个实例(如果 1-M 关系(不包括索引),每次重复最多只存储 8 个字节)。

  • 将超过 32 字节的膨胀和满足多对多关系所需的最大值(映射表中的 8 字节父项、8 字节子项和两个 8 字节列)。

由于 SQLite API 使用 Cursors(缓冲)来检索提取的数据,因此随着存储需求的增加,CursorWindow(由 x 行输出加载的有限大小的缓冲区)一次可以保存的行数更少。 还有更大的潜力,同样由于膨胀,单行大于 CursorWindow 允许的。

简而言之,对于对性能不太感兴趣的更小、更简单的项目,然后通过 TypeConverters 存储表示可能是更方便和实用的方法。 对于更大更复杂的项目,然后通过相关数据而不是嵌入表示中的数据释放 SQLite 的关系方面很可能是通往 go 的方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM