database - 需要有关对处理民意调查响应的数据库进行非规范化的建议

标签 database schema denormalization

我的网络应用程序处理民意调查(调查)。现在我有 2 个表作为数据库架构的一部分。

polls
    id
    question
    choices (ex: yes,no,maybe)
    created

polls_responses
    poll_id
    user_id
    tracker_id
    response

问题是在一些民意调查中我有很多回应(> 1000)。人们可以查看投票结果,它会显示有多少用户投票赞成、反对或可能,以及有多少匿名用户投票赞成、反对或可能。这样做的问题是,无论何时用户查看投票结果,它都必须遍历所有响应并计算响应总数、每个选择的响应数量、用户做出的每个选择的响应数量,以及tracker_id(匿名用户)做出的每个选择的响应数量,计算百分比并将其显示在条形图中。这使得页面加载非常慢。我正在考虑对数据库进行非规范化以提高性能,这样我们就有了这样的东西

polls
    id
    question
    choices (ex: yes,no,maybe)
    total_responses (ex: 10,3,3,4)
    user_responses (ex: 5,2,2,1)
    anon_responses (ex: 5,1,3,1)
    created

polls_responses
    poll_id
    user_id
    tracker_id
    response

也就是说,对于total_responses中的值,10是总数,3是选项的# of responses yes,3是选项的# of responses no,4 是选择 maybe 的响应数。相同的格式适用于 user_responsesanon_responses 字段。如果我能对这种方法提出一些意见,将不胜感激!感谢您的宝贵时间。

编辑:我正在使用 MySQL

最佳答案

首先,我不认为你需要循环来计数。

看看这样的东西

SELECT  poll_id,
        COUNT(response) Total,
        SUM(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) TotalYes,
        SUM(CASE WHEN response = 'N' THEN 1 ELSE 0 END) TotalNo,
        SUM(CASE WHEN response = 'M' THEN 1 ELSE 0 END) TotalMaybe,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) UserYes,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) UserNo,
        SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) UserMaybe,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) TrackerYes,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) TrackerNo,
        SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) TrackerMaybe
FROM    polls_responses
GROUP BY poll_id

这应该让您获得每个 poll_id 的相应结果,然后您可以从那里返回表以检索投票详细信息。

关于database - 需要有关对处理民意调查响应的数据库进行非规范化的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294550/

相关文章:

database - 如何使用唯一组合键

database - 即使在 bindNode 之后,CakePHP 中的 Aros 表仍然包括用户

mysql - 什么 "other features"可以合并到火车数据库中?

sql - 用于散列的脚本生成 SQL 服务器数据库架构的最快方法

google-bigquery - BigQuery 表设计 - 混合事实表和维度表?

database - 非规范化:多少算太多?

c# - 与 SQL Server 数据库相关的语法错误

database - 配方数据库设计

node.js - 在 Mongodb 中对单个集合使用多个模式不起作用

java - Google App Engine 中的非规范化?