【问题标题】:Database Designing for Vote Buttons投票按钮的数据库设计
【发布时间】:2012-09-03 06:02:32
【问题描述】:

我正在从事一个项目,其中我有类似于 StackOverFlow 的上下投票选项。我在数据库设计方面没有太多经验,因此我遇到了以下问题,

首先,这是我的投票表结构:

  1. voteId-----AUTO_INCREMENT 与 PRIMARY KEY。
  2. mediaId----用户投赞成票/反对票的媒体。
  3. userId-----投票的用户。
  4. voteMode---1 表示赞成票,0 表示反对票。这是一个整数字段。

在这种情况下,如果我有 100 个用户和 100 个媒体,那么我将在此表中总共有 100x100 条记录。

这里出现的问题是数据库正在处理大量记录,而投票按钮现在反应迟钝。这让我的客户不高兴,让我陷入困境。

谁能给我一个更好的模型来避免这个巨大的桌子?

我正在使用 jQuery.ajax 向服务器发布我的投票。此外,该项目基于 PHP 和 Zend Framework 1.11。因此,当我单击 UP 图标时,需要一些时间来响应。 Mozilla 曾经崩溃过某些时候。 我测试了通过包含大量垃圾记录(大约 15000 条)的循环插入

【问题讨论】:

  • 您是否使用任何索引?哪些查询很慢?
  • 您使用的 PHP 框架是(或应该)与数据库结构完全无关的。更重要的是您使用 JQuery。您可以编写一个投票桌面应用程序,但仍然需要相同的数据库。不要让这些事情影响您的决策。
  • 不,我不是。对韦恩不太熟悉。我以前从未尝试过很多数据库。
  • 为您几乎没有经验的“客户”提供服务,往好里说是冒险,往坏里说是完全不负责任。
  • 当一个投票时,您正在插入数据库,对吗?这是发生得很慢吗?

标签: php mysql database zend-framework database-design


【解决方案1】:

您可以尝试这些升级表架构:

//All id's are now unsigned , As you do not need any sign 
ALTER TABLE `voting` 
CHANGE `voteid` `voteid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
CHANGE `mediaId` `mediaId` INT(11) UNSIGNED NOT NULL, 
CHANGE `userId` `userId` INT(11) UNSIGNED NOT NULL, 
//ENUM datatype as you need only 2 type of value
CHANGE `voteMode` `voteMode` ENUM('1' , '2') NOT NULL ; 

//Adding index , it will surely increase some speed
//Do **not use** index in **columns you do not need**
ALTER TABLE  `voting` ADD INDEX (  `mediaId` ,  `userId` ) ;

通过Mysql Index 了解有关索引的更多信息。

如果您使用的是MyISAM Storage Engine,那么我建议您使用InnoDB Storage EngineIt 可以帮助您决定应该使用哪个引擎。

还有一些可能对您有所帮助的技巧:

  1. MySQL Query Cache
  2. Prepared Statements in php
  3. COLUMNS Partitioning

一些关于 MySql 数据库优化的资源:

  1. MySQL Tuning
  2. Mysql Optimization
  3. Real World Scalability MySQL

【讨论】:

  • 感谢您的信息。让我试试这个。
【解决方案2】:

好的,有两件事。 15k 条记录不算什么,因此几乎不会造成问题。我正在使用具有 150M 行的表,并且查询在 0.005 秒内仍然表现良好

  1. 我怀疑您使用的是 MyIsam 而不是 InnoDB。使用 MyIsam,每次插入(或更新)都会锁定整个表。因此,当有人投票时,表格被锁定,其他人无法从中读取。如果您有成千上万的用户,这可能会成为一个问题。

  2. 确保您拥有正确的索引。我不确定哪些查询很慢(以及有多慢!),但请确保您在搜索的列上有索引(可能是 mediaId)。

如果您想要更好的建议,请发布速度较慢的查询。

【讨论】:

  • 它的 InnoDB。检查我对您在顶部提出的问题的评论
  • 这里是:实际上我使用的是 Citrix,数据库在里面。这就是我输入字段而不是查询的原因。我不能从中复制任何东西。但是让我检查一下我的索引。
  • 知道了,哥们,实际上没有定义索引...!我尝试了 SHOW CREATE TABLE 并在那里找不到。另外,我只使用 InnoDB。
  • 坦率地说,我不太了解 MySQL 和 DB 操作。我刚刚尝试了索引。它工作正常....
  • 它现在工作正常。现在我开始使用 Zend 开发 Lucene 以使其更快。
【解决方案3】:

如果您想跟踪哪些用户为 x media 投票,并且每个用户都投票,那么您的最小数据量是users * media

如果你想拥有更少的数据,你必须做出让步。也许让用户匿名注册和投票?如果可以从投票行为中提炼出个人偏好,大多数用户都不会很高兴。

【讨论】:

  • 是的,还有其他方式来存储这些数据吗...?
  • 我限制了多次投票和匿名投票
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
相关资源
最近更新 更多