Mysql 一套套一套?或者,为集合的集合实现版本控制

Mysql 一套套一套?或者,为集合的集合实现版本控制,mysql,database-design,rdbms-agnostic,Mysql,Database Design,Rdbms Agnostic,我正在开发一个用于质量控制清单的web应用程序。我已经设置了一个表,但我有一种预感,我们的模型是次优的,我可以得到更好的性能。请不要告诉我我正在使用mysql,所以我只限于它的功能 每个清单都有几十个,有时是几百个问题。每个问题有2到10个可能的答案。每个问题都是一个varchar字符串,每个答案也是。当所有问题都与其中一个可能的答案相关联时,即选择了一个答案时,即为完整的检查表 检查表因不同的目的而不同,并且会随着时间的推移而变化。因此,为了防止在我们想要更改新的检查表时无意中更改已完成的检查

我正在开发一个用于质量控制清单的web应用程序。我已经设置了一个表,但我有一种预感,我们的模型是次优的,我可以得到更好的性能。请不要告诉我我正在使用mysql,所以我只限于它的功能

每个清单都有几十个,有时是几百个问题。每个问题有2到10个可能的答案。每个问题都是一个varchar字符串,每个答案也是。当所有问题都与其中一个可能的答案相关联时,即选择了一个答案时,即为完整的检查表

检查表因不同的目的而不同,并且会随着时间的推移而变化。因此,为了防止在我们想要更改新的检查表时无意中更改已完成的检查表,我们有了模板。模板、问题和答案是清单、问题和答案的镜像,代表清单的“当前版本”

表层次结构如下所示

。客户

模板 模板问题 模板问答 检查表 清单问题 清单问题答案 因为我们不希望当前模板中的更改“及时返回”并更改已完成的检查表,所以当用户开始创建新的检查表时,数据会从模板复制到检查表中

正如你所猜测的,这会造成大量的重复。在ChecklistQuestionAnswers中,在大约一百万个答案行中,只有4000个不同的答案。当然,TemplatesQuestionAnswers也有重复,但没有那么糟糕

所以我想我要做的是为清单模板创建一个版本控制系统,这样我可以通过只存储一次带有唯一答案集的唯一问题来节省空间。这样,我就不用大量复制文本,只需将检查表与模板的版本链接起来,然后检查表集就是为哪个问题选择了哪个答案

这是我到目前为止画的草图

客户机有许多模板。A. 模板有许多修订,但只有 一个最新版本。每次修订 有很多问题,每个问题 有2到10个答案。 每个检查表都与一个 样板每个检查表都有一套 指示答案的答案 为其列表中的每个问题选择 模板的版本

我遇到的麻烦是确保ChecklistAnswers关联一对正确的问题和答案-存在于模板版本中的关系,它的检查表父级正在引用该模板

换句话说,ChecklistAnswers中的每一行都必须将TemplateQuestions中的问题id“镜像”到TemplateQuestionAnswers中的一个子问题,形成检查列表中的模板版本。我正试图思考如何做到这一点,我的思考过程在这里短路。这实际上是数据库的“可交付成果”——一个完整的清单——所以所有其他模板和所有内容都是附带现象或抽象的。如果我做不到这一点,我就错过了重点

这似乎有点笨拙,所以我想知道我是否正在制定一个解决方案,它的复杂性不值得我从实现它中节省空间


还要注意的是,我已经简化了一点。还有其他方面的复杂性,比如用于报告问题分组的分类系统,但我认为我们不需要在这里讨论这个问题

据我所知:

您正在做的一个简单改进可能是使用3个表作为模板,而仅使用2个表作为实际检查表: 所用模板版本的检查表外键 回答检查表外键,模板外键回答

因此,如果您想检索特殊清单的答案列表,您可以:

select  <whatever columns you like>
from checklist c, answer a, templateAnswer ta, templateQuestion tq
where  a.checklist_id = c.id AND a.ta_id = ta.id AND ta.tq_id = tq.id AND
c.id = <something>
注:如果问题共享答案,并且在许多情况下它们可能会共享答案,那么您可以创建一个表格,列出唯一的答案: templateAnswers和表templateAnswerUsage外键用于模板答案,外键用于模板问题。这样你就不会有答案文本的重复。 问题和答案之间本质上是多对多的关系。
这可能有意义,也可能没有意义,这取决于答案的平均大小是否大于您将使用的ID的大小。

在我的草图中,我只有两个检查表-检查表和检查表答案-我没有说明这一点吗?我知道这很让人困惑:我不认为查询会成为问题,但让具有有意义和正确关系的值进入ChecklistAnswers表是我无法理解的。问题确实共享答案-因此建议中的答案表。对不起,我错过了你的一些草图解决方案。我认为您的问题在于,在ChecklistAnswers中,您有一个指向答案表的外键,或者这不是真的吗?在这里,您应该有一个指向TemplateQuestionAnswers表的外键。模板问题答案已绑定
答案可能是有问题的,所以如果你引用它,你将保持绑定。我想你知道了什么,但我的大脑又短路了…:如果我有一个TemplateQuestionAnswers表的外键,它只能保证我从TemplateQuestionAnswers中得到任何答案,而不是将答案限制在一组可能的答案中,我认为这些答案都与一个问题TemplateQuestions有关
select  <whatever columns you like>
from checklist c, answer a, templateAnswer ta, templateQuestion tq
where  a.checklist_id = c.id AND a.ta_id = ta.id AND ta.tq_id = tq.id AND
c.id = <something>