有设计问题,希望得到一些建议。
我预计有540名参与者完成18项调查。每个调查应该有30名参与者(完成/提交调查 - 而不仅仅是访问调查)。这些调查高度相似(结构相同;只是在某些措辞/图像上有所不同。可以从相同的 html 派生)。
我过去的做法是只托管一个html,并在html/JavaScript中有一个随机数生成器。当请求页面时,将生成一个介于 1 到 18 之间的随机数,并根据该数字生成 18 个调查中的一个并返回给参与者。从某种意义上说,这非常方便,因为我只需要维护一个 html 页面,并担心根据给定的数字生成不同的调查。然而,我注意到参与者的分布并不完全均匀——我可能在一项调查中有 25 名参与者,而在另一项调查中可能有 35 名参与者。这可能是由于来自随机数生成器的随机性(我认为我对此无能为力 - 如果我错了,请纠正我)。
我正在寻找更好的解决方案。我想过在服务器端有一个计数器,并根据计数重定向参与者(例如,每个第一个参与者去第一次调查,每个第二个参与者去第二次调查......每 18 名参与者参加第 18 次调查)。但是,这只能保证参与者均匀地访问调查,而不是完成/提交调查 - 参与者可以完全增加计数,但不能完成调查。如果他不提交调查,则不应增加计数。但是,如果计数没有增加,则无法为他(和连续的参与者)分配调查。在柜台上锁是不现实的,因为会有这么多参与者等待获得号码,因此调查......啊,我需要一些帮助@.@
任何解决方案/建议?
提前感谢您的任何回复!
这个怎么样:
为每个调查创建单独的计数器,并将其存储在数据库中。每次用户请求调查时,从数据库中获取计数器,循环访问它们,然后返回计数<30 的第一个调查。将用户重定向到所述调查,并增加该调查计数器。
要确保实际提交调查,您可以执行以下操作: 在数据库中创建另一个表。每次向用户提供调查时,请在包含以下内容的表中插入一条新记录: unique_id, survey_id, timestamp
.将unique_id与调查一起传递给用户,并在提交后从数据库中删除关联的条目。现在,在选择调查(如上所述)之前,您可以获取此数据,对于时间戳> 10 分钟前的任何条目,您可以假设它未提交,并减少调查计数器。
你的服务器端计数器想法很棒。为了解决人们未完成调查的问题,请使用cookie或某种登录系统,参与者需要在其中识别自己的身份(我认为这是一个匿名调查,所以cookie更好)。
- 在服务器端有一个计数器。
- 当用户到达时,为他们设置一个cookie,其中的调查ID从柜台(1 - 18)计算出来,这样您就可以记住用户属于哪个调查。
- 当用户到达时,检查带有ID的cookie - 如果他们有cookie,请将它们发送到适当的调查,而不增加计数器。如果没有,请递增计数器并使用新 ID 为用户设置一个 cookie。
怎么看?:)
鉴于答::您有 18 个调查需要由 540 名参与者随机填写,每个调查完美地分为 30 个提交B:您只托管一个html文件,根据从服务器发送的数字,通过javascript生成18个调查中的1
个不知道您如何存储调查结果,我认为一个好的策略可能是:在 BE 上保留序列号 1-540 的随机数组(用作每个调查的 ID)和从 0 开始的指针。当参与者请求页面时,为他们分配数组中的下一个数字并递增指针。使用 cookie 将该号码保留给该用户,以便他们始终看到相同的号码。根据该数字为他们分配一个调查,1-30 是调查 1,依此类推。
这将确保如果您预计有 540 名访问者,则每个人都会随机获得 540 个调查中的一个。如果他们重新访问,他们仍然会收到相同的调查。
如果您想处理超过 540个请求页面能够接收旧用户从未提交的调查的其他用户,您可以将指针增加到 540 以上,但使用取模运算符。
nextSurveyId = randomSurveyIDs[ surveyPointer%540 ];调查指针++;
这将确保首先重新分配最早分配的调查。您还可以维护一个单独的已完成调查字典,以便在从原始数组中选择下一个随机 surveyId 时进行检查,递增指针,直到确定要重新分配的下一个最旧的未完成调查。当两个数组的长度相同时,所有调查都已提交。