代码之家  ›  专栏  ›  技术社区  ›  axsuul

需要对处理投票响应的数据库进行非规范化的建议

  •  4
  • axsuul  · 技术社区  · 16 年前

    我的网络应用程序处理投票(调查)。现在我有两个表作为数据库模式的一部分。

    polls
        id
        question
        choices (ex: yes,no,maybe)
        created
    
    polls_responses
        poll_id
        user_id
        tracker_id
        response
    

    问题在于,在一些民意测验中,我有很多答案(>1000)。人们可以查看投票结果,它将显示有多少用户投票赞成、反对或可能,有多少匿名用户投票赞成、反对或可能。问题在于,每当用户查看投票结果时,它必须循环浏览所有响应,并计算响应总数、每个选择的响应总数、每个用户所做选择的响应总数以及跟踪者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是供选择的回答 yes ,3是供选择的回答 no ,4是供选择的回答 maybe . 同样的格式也适用于 user_responses anon_responses 领域。如果我能对这种方法有一些看法,我将不胜感激!谢谢你抽出时间。

    编辑:我正在使用MySQL

    2 回复  |  直到 16 年前
        1
  •  3
  •   Adriaan Stander    16 年前

    首先,我不认为你需要循环来计算这个。

    看看这样的东西

    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
    

    这将为您获得每个投票ID的相应结果,然后您可以从中加入到表中以检索投票详细信息。

        2
  •  0
  •   Antony    16 年前

    不要害怕使用数据库为您做一些繁重的工作。您不必遍历输出中的所有响应。

    您还没有指定数据库平台,但是您可以在数据库中使用一些联接和聚合函数或一些子选择来处理这个问题。