以良好的性能持久化分层数据的集合

Posted

技术标签:

【中文标题】以良好的性能持久化分层数据的集合【英文标题】:Persisting collections of hierarchical data with good performance 【发布时间】:2017-04-04 19:33:27 【问题描述】:

在我的特殊情况下,我正在使用 java、jdbcTemplate 和 HSQLDB 数据库,但我认为这可以被视为关于数据库持久性的一般问题。

假设我有一个 People 集合。每个人都可以是其他人的父母,也可以是其他人的孩子。假设每个人可以有多个地址,以及多个属性,例如身高、体重和眼睛颜色。

所以我们有以下表格。

地址(参考人表)

属性(引用回人员表)

关系(有两个引用返回到人员表,一个用于父级,一个用于子级)

假设我有大量人员需要在我的应用程序中持久化。

以良好的性能持久保存这些数据的良好模式是什么?

显然,一次一个地坚持每个人会很慢。

下一个选项是将所有人员、他们的所有地址、属性和关系收集到他们自己单独的集合中,并将它们分批保存。

但是,这就是我目前卡住的地方。

我正在使用数据库生成的序列 ID。

如果我首先保存一批中的所有人员,我如何让人员 ID 来保存这些人员的所有地址、属性和关系?

我应该切换到在我的应用程序代码中生成 ID,如果是,最佳做法是什么?

或者我是否应该使用应用程序代码中已知的不同密钥以某种方式引用所需人员。比如人名+姓列...

还有其他方法吗?

【问题讨论】:

【参考方案1】:

你计划做事的方式是行不通的。

您似乎与数据库有些耦合,因为您有数据库发出您的 ID,但您似乎也将所有数据都保存在内存中,并且需要以某种方式一次性将所有内容保存到数据库中。这两种操作模式互不兼容。

通常这样做的方式是与数据库完全集成,或者根本不使用数据库。

与数据库完全集成意味着使用像 Hibernate 这样的对象关系映射 (ORM) 框架,可能通过 JPA。你真的应该阅读这两个。这样一来,您就不会将所有数据都保存在内存中,因此无需担心如何一次保存大量数据。

要完全不使用数据库,请在应用程序关闭之前将所有数据流式传输到 XML 文件中,并在应用程序启动时从同一个 XML 文件中流式传输数据。阅读 JAXB 以了解如何实现这一目标。

【讨论】:

您好,谢谢您的回复。 1)信不信由你,我一开始是用 Hibernate 解决我的问题,但后来因为想要更精细的控制以及我缺乏理解而感到沮丧并放弃了,我肯定会考虑再次使用它多一点事先阅读。 2) 基于文件的持久性对我无效,除了我更喜欢 JSON :P 3) 你为什么说它不可行?无论如何,Hibernate 不会解决我在幕后描述的问题吗? Hibernate 是如何解决的?【参考方案2】:

我正在使用数据库生成的序列 ID。

当使用多台服务器时,您需要 ID 的 DB(或一些复杂的分布式同步)。不过,您可以从数据库中获取 ID 并手动分配它。为了有效地做到这一点,您可以使用 hi-lo 算法(或更好:pooled)。

如果我首先持久化一批中的所有人员,我如何让人员 ID 持久化这些人员的所有地址、属性和关系?

不知道,如何做到这一点。这肯定是可能的,因为 Hibernate 可以做到。自己分配 ID 可能更简单。

或者我是否应该使用应用程序代码中已知的不同密钥以某种方式引用所需人员。比如人名+姓列...

这可能会变得复杂并且可能不起作用。名字和姓氏不唯一的情况很常见。

【讨论】:

以上是关于以良好的性能持久化分层数据的集合的主要内容,如果未能解决你的问题,请参考以下文章

将 UI 相关信息持久化到分层应用程序中的数据库

初识 Redis

数据库操作分层结构总结

REDIS03_概述安装key字符串String列表List集合SetHash哈希Zset有序集合持久化策略

Redis基础学习笔记

Redis