投票按钮的数据库设计

时间:2012-09-10 11:16:20

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

我正在开发一个项目,其中我有类似于StackOverFlow的投票选项Up和Down。我在数据库设计方面经验不足,因此我遇到了以下问题,

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

  1. voteId -----带有PRIMARY KEY的AUTO_INCREMENT。
  2. mediaId ----用户进行上/下投票的媒体。
  3. userId -----投票的用户。
  4. voteMode --- 1表示Up Vote,0表示Down Vote。这是一个整数字段。
  5. 在这种情况下,如果我有100个用户和100个媒体,那么我将在此表中拥有100x100个记录。

    这里出现的问题是数据库正在使用大量记录并且投票按钮现在反应迟钝。这让我的客户不高兴,我遇到了麻烦。

    任何人都可以建议我一个更好的模型来避免这个巨大的表吗?

    我正在使用 jQuery.ajax发布我的投票给服务器。此外,该项目基于 PHP和Zend Framework 1.11 。所以当我点击UP图标时,需要一些时间来回复。 Mozilla曾经崩溃过一段时间。 我测试了通过循环插入大量垃圾记录(大约15000)

3 个答案:

答案 0 :(得分:1)

好的,两件事。 15k记录是没有什么,所以不能给出一个问题。我正在使用具有150M行的表,并且查询在.005s下仍然表现良好

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

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

  3. 如果您想要更好的建议,请发布缓慢的查询。

答案 1 :(得分: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
  4. 有关MySql数据库优化的一些资源:

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

答案 2 :(得分:0)

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

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