我有一个相当技术要求,我正在尝试用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实现这一点有哪些注意事项?