微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何查询历史数据

如何解决如何查询历史数据

我正在尝试使用 Spring Data JPA 和 MysqL 实现这个简单的想法。我有桌子:

╔════╦═════════════════════╗
║ Id ║       Question      ║
╠════╬═════════════════════╣
║  1 ║ Who are you?        ║
║  2 ║ Whats your name?    ║
║  3 ║ Where are you from? ║
╚════╩═════════════════════╝

╔════╦════════╦═════════╦════════════╗
║ Id ║ UserId ║  Answer ║ QuestionId ║
╠════╬════════╬═════════╬════════════╣
║  1 ║    1   ║ Answer1 ║     1      ║
║  2 ║    1   ║ Answer2 ║     2      ║
║  3 ║    1   ║ Answer3 ║     3      ║
║  4 ║    2   ║ Answer4 ║     1      ║
║  5 ║    2   ║ Answer5 ║     2      ║
║  6 ║    2   ║ Answer6 ║     3      ║
╚════╩════════╩═════════╩════════════╝

然后我想得到 User+Question+Answer 的结果。它适用于标准 Spring Data 查询,例如 answersRepository.findAll(); 我得到了结果:

╔════════╦═════════╦═════════════════════╗
║ UserId ║  Answer ║       Question      ║
╠════════╬═════════╬═════════════════════╣
║    1   ║ Answer1 ║ Who are you?        ║
║    1   ║ Answer2 ║ Whats your name?    ║
║    1   ║ Answer3 ║ Where are you from? ║
║    2   ║ Answer4 ║ Who are you?        ║
║    2   ║ Answer5 ║ Whats your name?    ║
║    2   ║ Answer6 ║ Where are you from? ║
╚════════╩═════════╩═════════════════════╝

但是如果问题可以改变,如何实现这个逻辑? 例如,User1 回答了 Who are you? 问题,在此问题更改为 Who are u? 之后,例如在第二个版本中回答了 User2

我需要结果:

╔════════╦═════════╦═════════════════════╗
║ UserId ║  Answer ║       Question      ║
╠════════╬═════════╬═════════════════════╣
║    1   ║ Answer1 ║ **Who are you?**    ║
║    1   ║ Answer2 ║ Whats your name?    ║
║    1   ║ Answer3 ║ Where are you from? ║
║    2   ║ Answer4 ║ **Who are u?**      ║
║    2   ║ Answer5 ║ Whats your name?    ║
║    2   ║ Answer6 ║ Where are you from? ║
╚════════╩═════════╩═════════════════════╝

我尝试使用 Spring Data Envers (Hibernate Envers) 来实现这个逻辑,但我认为这不是发明审计的原因。那么我该怎么做呢?也许我需要使用诸如事件溯源技术之类的东西?

解决方法

这实际上取决于更改问题的语义及其业务相关性。

让我们考虑几个变体。

  1. 如果真的是关于审计的话,Envers 是正确的工具。 IE。 99.9% 的应用程序不关心不同的变体。查询往往会变得相当复杂,因为您必须找出正确的修订版本,而不同实体的修订版本是完全独立的。这就是为什么您只想在极少数情况下使用它。

  2. 您并不真正关心存在的问题的所有变体,您只需要确保对于答案,您拥有发布答案时出现的确切问题。在这种情况下,您应该将问题文本复制到答案表的额外列中。这听起来像是数据重复,但事实并非如此。问题表保存当前问题。回答表在回答问题时保存问题。当一个更新时,另一个不会。

  3. 如果您需要跟踪问题的所有变体,您应该在问题表中添加一个 variant 字段,该字段将成为主键的一部分,而不是更改它获取的问题使用递增的 variant 值复制。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?