我正在 ASP.NET 中开发调查应用程序。我有三个表及其列如下:-
成员 ( id, email, Name, Password, type(user or admin) )
Survey(id,ownerId,Name,surveyHits(填了多少次))
问题(id、SurveyId、...一些其他字段)
我将访问调查的每个访问者存储在 Members 表中。
现在我需要的是,我想将调查的所有访问者与调查本身相关联,这样就没有人可以重复调查。
我应该做什么,或者确切地说,我应该如何保存和跟踪特定调查的访问者?
如果需要,我也可以更改数据库架构...
编辑:-
创建一个新表来存储“surveyId”和“memberId”的组合作为主键是一种解决方案,但是,
假设我有 1,000 个调查和 10,000 个成员。每个成员都填写了每项调查,所以我将保留 1000 万 记录,而只有 11000 条记录。
我不能有一些更有效的解决方案吗?
高效是指节省空间吗?因为 EagleRainbow 的建议可能是最省时的。如果您正在寻找节省空间的方法,那么这取决于您可以对成员如何进行调查施加哪些限制(如果有的话)。
如果有严格的顺序,例如成员需要按 id 顺序或 created_dtm 顺序等进行调查,然后您可以在成员上存储他们完成的最后一次调查。
如果没有排序,那么您可以根据 EagleRainbow 的建议对表格进行一些非规范化处理,但这将需要更多代码,并且需要更长的时间来记录每项调查。您可以存储已完成的连续调查 ID(或 dtms,或其他一些唯一调查标识符)的范围。然后尽快合并这些记录,并删除多余的记录。
假设您正在记录通过他们的 id 完成的调查,那么表格可能如下所示:
CompletedSurveyRange
@range_id
成员(member)编号
min_survey_id
max_survey_id
如果成员(member) 8765 开始做调查 333,那么您创建记录:
(range_id=1000,member_id=8765,min_survey_id=333,max_survey_id=333)。
忽略任何其他成员,假设他们接下来进行调查 335。由于已记录的调查与新调查之间存在差距 (334),您需要创建新记录:
(1001、8765、335、335)。
假设下一个调查是 332。这可以添加到第一个记录中,因为它是一个相邻的调查。所以你最终得到了这些记录:
(1000, 8765, 332, 333)
(1001, 8765, 335, 335)
我将跳过细节,但假设他们按顺序进行调查 336-340,因此记录 1001 的最大值每次都会增加,您最终会得到:
(1000, 8765, 332, 333)
(1001, 8765, 335, 340)
然后他们进行调查 334。这弥合了记录 1000 和记录 1001 之间的差距,因此您可以合并它们并删除其中一个(哪个并不重要 - 我会任意保留较低的 ID)。你最终得到:
(1000, 8765, 332, 340)
(1001, 8765, 335, 340) <= 已删除
如果您有 N 个调查,那么每个成员最多有 N/2 个实时记录(他们已完成 N/2 个调查,其中 ID 是列表中的所有其他 ID)。一旦他们完成进一步的调查,它将下降到 (N/2)-1,因为一条记录将合并到另一条记录中并因此被删除。如果他们以不同于其他模式的模式完成调查,那么进行 N/2 次调查将需要少于 N/2 条记录,并且它永远不会增长到大于 N/2。