如何查询历史数据
How to query for historical data
我正在尝试使用 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 数据查询很好 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) 来实现这个逻辑,但我认为这不是发明审计的原因。那我该怎么做呢?也许我需要使用诸如事件溯源技术之类的东西?
这实际上取决于更改问题的语义及其业务相关性。
那么让我们考虑几个变体。
如果这真的与审计有关,Envers 是正确的工具。 IE。 99.9% 的应用程序不关心不同的变体。查询往往会变得相当复杂,因为您必须找出正确的修订,而不同实体的修订是完全独立的。这就是为什么你只想在极少数情况下使用它。
您并不真正关心存在的问题的所有变体,您只需要确保对于答案,您有发布答案时出现的确切问题。在这种情况下,您应该将问题文本复制到答案的额外列中 table。这听起来像是数据重复,但事实并非如此。问题 table 包含当前问题。答案 table 保留回答时的问题。当一个更新时,另一个不会更新。
如果您需要跟踪问题的所有变体,您应该在问题 table 中添加一个 variant
字段,这将成为主键的一部分而不是更改问题,而是使用递增的 variant
-value.
复制问题
我正在尝试使用 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 数据查询很好 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) 来实现这个逻辑,但我认为这不是发明审计的原因。那我该怎么做呢?也许我需要使用诸如事件溯源技术之类的东西?
这实际上取决于更改问题的语义及其业务相关性。
那么让我们考虑几个变体。
如果这真的与审计有关,Envers 是正确的工具。 IE。 99.9% 的应用程序不关心不同的变体。查询往往会变得相当复杂,因为您必须找出正确的修订,而不同实体的修订是完全独立的。这就是为什么你只想在极少数情况下使用它。
您并不真正关心存在的问题的所有变体,您只需要确保对于答案,您有发布答案时出现的确切问题。在这种情况下,您应该将问题文本复制到答案的额外列中 table。这听起来像是数据重复,但事实并非如此。问题 table 包含当前问题。答案 table 保留回答时的问题。当一个更新时,另一个不会更新。
如果您需要跟踪问题的所有变体,您应该在问题 table 中添加一个
复制问题variant
字段,这将成为主键的一部分而不是更改问题,而是使用递增的variant
-value.