【问题标题】:How to query for historical data如何查询历史数据
【发布时间】:2021-05-02 22:02:56
【问题描述】:

我正在尝试使用 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 的结果。像answersRepository.findAll(); 这样的标准 Spring Data 查询很好 我得到了结果:

╔════════╦═════════╦═════════════════════╗
║ 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) 来实现这个逻辑,但我认为这不是发明审计的原因。那么我该怎么做呢?也许我需要使用诸如事件溯源技术之类的东西?

【问题讨论】:

    标签: java database-design spring-data-jpa spring-data-envers historical-db


    【解决方案1】:

    这真的取决于改变问题的语义和它的业务相关性。

    所以让我们考虑几个变体。

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

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

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

    【讨论】:

    • 感谢您的回答。我使用了第二种变体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-05-11
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多