如何在数据库中存储特定条目的访问者?

How to store visitors of a particular entry in database?

我正在 ASP.NET 开发调查应用程序。我有三个 table 及其列如下:-

成员 (id, email, Name, Password, type(user or admin) )

Survey (id,ownerId,Name,surveyHits(填了多少次))

问题(id、SurveyId、...一些其他字段)

我将访问调查的每个访问者存储在会员中 table。

现在我需要的是,我想将调查的所有访问者与调查本身相关联,这样就没有人可以重复调查

我应该怎么做,或者确切地说,我应该如何保存和跟踪特定调查的访问者?

如果需要,我也可以更改数据库模式...

编辑:-

创建一个新的 table 存储 "surveyId" 和 "memberId" 的组合作为主键是一个解决方案但是,

假设我有 1,000 个调查和 10,000 个成员。每个成员都填写了每项调查,所以我将保留 1000 万 条记录,而只有 11000 条记录。 我不能有一些更有效的解决方案吗?

我建议引入一个新的数据库 table 来跟踪会员和调查之间的组合。

CREATE TABLE FilledSurveys (
   MemberId as int not null,
   SurveyId as int not null,
   foreign key (MemberId) references Member(id) on update cascade,
   foreign key (SurveyId) references Survey(id) on update cascade,
   primary key (MemberId, SurveyId)
);

为确保一致性,您应该使用 foreign key relationships (keep in mind that this might require to use the InnoDB engine). This table may also make the - for me somewhat - strange persisted attribute surveyHits of Survey obsolete, as the same data can be calculated 飞经

SELECT SurveyId, count(*) as surveyHits
   FROM FilledSurveys 
   GROUP BY SurveyId

但是,请注意:虽然之前您的数据库是完全匿名的并且 Members/Visitors 无法跟踪他们的调查结果 - 现在这将消失:调查和会员之间存在明确且持久的关系.

高效是指space高效吗?因为 EagleRainbow 建议的可能是最省时的。如果您正在寻找 space 高效,那么这取决于您可以对成员如何进行调查施加哪些限制(如果有的话)。

如果有严格的顺序,例如会员需要按 ID 顺序或 created_dtm 顺序等进行调查,然后您可以将他们完成的最后一次调查存储在会员中。

如果没有排序,那么您可以根据 EagleRainbow 的建议对 table 进行一些非规范化处理,但这将需要更多代码并需要更长的时间来记录每个调查。您可以存储已完成的连续调查 ID(或 dtms,或其他一些唯一调查标识符)的范围。然后您尽快合并这些记录,并删除多余的记录。

假设您正在记录通过他们的 id 完成的调查,那么 table 可能如下所示:

已完成调查范围
@range_id
member_id
min_survey_id
max_survey_id

如果会员 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。