使用NHibernate设置clone-on-update /版本控制

时间:2012-06-14 11:35:15

标签: sql nhibernate

我有一个相当技术要求,我正在尝试用NHibernate来实现它的正确方法。

我正在制作一个允许用户创建和回答问卷的应用程序。我有这四个表:

Questions
    int QuestionId
    string QuestionText

Questionnaires
    int QuestionnaireId
    string Name

QuestionsInQuestionnaires
    int Id
    int QuestionId
    int QuestionnaireId

Answers
    int AnswerId
    string AnswerText
    Question Question

问题出现在称为调查问卷的小组中。当用户回答问卷时,为每个问题生成一个Answer。每个Answer都会引用与其相关的Question

这很好。但是,如果现有问题的文本发生了变化,那么与之相关的任何答案都可能没有意义,所以我需要保留每个答案所涉及的问题,而不是让它被编辑。我可以将QuestionText复制到每个答案,但这对于更复杂的数据结构来说是一个糟糕的解决方案。

我的想法是永远不要更新问题 - 相反,我会克隆它。现有答案涉及原始问题,而问卷(和任何其他表格)将参考更新后的问题。

这有点棘手。一个简单的实现会出现可扩展性问题,因此我正在寻找更通用的解决方案。

我的一个想法是使用这样的数据结构:

Questions
    int QuestionId
    int LatestQuestionRevisionId

QuestionRevisions
    int QuestionRevisionId
    string QuestionText
    int QuestionId

Questionaires
    int QuestionnaireId
    string Name

QuestionsInQuestionnaires
    int Id
    int QuestionId
    int QuestionnaireId

Answers
    int AnswerId
    string AnswerText
    Question QuestionRevisionId

在这里,我引入了一个新的Question表,并将原始表更改为QuestionRevision。需要引用特定修订版的答案可以引用QuestionRevision表,而问卷调查表(仅应关注最新修订版)引用Questions表。

以合理的方式实现它可能有点棘手和耗时(Questions是一个更高的应用程序层不应该知道的表)。我不相信它会正常工作,我无法弄清楚如何编写我的模型对象和hbm.xml文件,以便它能够合理地工作。

我应该如何实现这样的系统,其中现有实体不会更新,而是克隆?那么关于这个主题的任何文章或教程是否相关?有没有我没考虑过的问题,或者我应该使用更好的方法/数据结构?使用NHibernate实现这一点有哪些注意事项?

0 个答案:

没有答案