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

标签 mysql database database-design database-schema

<分区>

我正在 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。

关于mysql - 如何在数据库中存储特定条目的访问者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37375237/

相关文章:

MySQL查询以最少的数据量获取行?

mysql - 找到子查询的总和

mysql - 错误! MariaDB 服务器进程 #{pid} 未运行

database - SQLSTATE[42000] : Syntax error or access violation: 1305

php - 在MYSQL中使用WHERE时可以使用多个参数吗

mysql - 如何在联结表中进行编辑

mysql - 用户在加密数据库字段上查找

mysql - 如何在mysql中按列值选择表?

database - 存储聊天消息图形数据库 neo4j 的最佳方式

database-design - 将自然客户和合法客户一起建模的最佳方式