【问题标题】:Correct modeling historical records in a database更正数据库中的建模历史记录
【发布时间】:2013-01-09 07:05:28
【问题描述】:

在我的应用程序中,我有一组在整个应用程序生命周期内保持活动状态的对象,我需要为它们创建一个历史数据库。

这些对象是 Java / Scala 类层次结构的实例,这些类使用 Hibernate 注释进行注释,我在我的应用程序中使用它来在启动时加载它们。幸运的是,所有类都已经包含时间戳,这意味着我不需要更改对象模型即可创建历史记录。

什么是最合适的方法:

  1. 使用Hibernate不带注解并提供外部xml映射,除了主键(现在是前一个主键+时间戳组成的复合键)外,与注解相同

  2. 对历史记录使用其他类(这听起来很复杂,因为我确实有一个层次结构的类而不是一个单一的类,我必须为每种类型的记录子类化我的 HistoricalRecordClass,因为我想重建它)。还是用休眠

  3. 使用完全不同的方法(请不要我不喜欢 ORMS,这只是一个方便的问题)

一些注意事项:

存储历史记录的目的是,用户可以通过单个 GUI 访问特定数据的实时值或历史值,只需指定日期即可。

【问题讨论】:

    标签: java database hibernate scala orm


    【解决方案1】:

    您打算如何使用历史记录?最简单的解决方案是将它们序列化为 JSON 并将它们记录到文件中。

    我从未将 hibernate xml 映射与 hibernate 注释结合使用,但如果它有效,它听起来比携带两个并行对象模型更有吸引力。

    如果您需要能够在任何时间点重新创建应用程序状态,那么您或多或少会被困在将它们写入数据库(因为快速随机访问)。您可以作弊并拥有一个“历史”表,其中包含 id + 时间戳 + 类型的复合键,然后是一个“json”字段,您只需将其编组并保存即可。这将有助于 a) 携带一个历史表而不是一堆克隆表,b) 如果架构发生变化(即利用 JSON 的开放架构性质),则可以为您提供一些灵活性

    但由于它是具有不同使用模式的存档数据(您只是在读取/写入整个记录),因此我会考虑使用其他方式来存储它,而不是使用与实时数据相同的严格模式。

    这是“一次编写”范式的一个很好的应用程序......您有可用的 Hadoop 吗? ;)

    【讨论】:

    • 我对任何解决方案都持开放态度。我没有 Hadoop,Hadoop 会给我带来什么?我正在建立一个财务数据的历史数据库...
    • 哦,Hadoop 只是一个不错的大数据存储,可以将数据转储到其中而无需担心。但这可能是巨大的矫枉过正。但好消息是它真的让我看到了“一次写入”范式......即你只写一次数据并且从不更新它......只读取。这就是您的历史数据。如果是这样,您可以进行各种强大的简化。
    猜你喜欢
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多