我正试图实现与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
回答了第二个版本。
I need result:
╔════════╦═════════╦═════════════════════╗
║ 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是正确的工具,如果这真的是关于审计。也就是说,99.9%的应用程序并不关心不同的变体。查询往往变得相当复杂,因为您必须找出正确的修订,而不同实体的修订是完全独立的。这就是为什么您只希望在极少数情况下使用它。
-
你真的不关心存在的问题的所有变体,你只需要确保你的答案是在答案发布时出现的确切问题。在这种情况下,您只需将问题文本复制到答案表的另一列中。这听起来像是数据复制,但事实并非如此。问题表保存当前的问题。答案表在回答问题时保存问题。当一个被更新时,另一个不会。
-
如果你需要跟踪一个问题的所有变量,你应该在问题表中添加一个
variant
字段,这将是主键的一部分,而不是改变一个问题,它会被复制一个增加的variant
-值。