如何在数据库中存储特定条目的访问者?
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。
我正在 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。