当前位置:  数据库>mysql

拥有5星评级数据库表结构 如何才能更高效的使用?

    来源: 互联网  发布时间:2014-10-08

    本文导语:  产品数据库设计时,经常遇到5星评价的情况,数据表如何设计才能即保证查询效率,又能减少数据冗余呢? 初步设计思路如下,请大家指正。 一,最终效果, 二,表结构 代码如下:CREATE TABLE IF NOT EXISTS `books` (  `id` int(8) NOT...

产品数据库设计时,经常遇到5星评价的情况,数据表如何设计才能即保证查询效率,又能减少数据冗余呢?

初步设计思路如下,请大家指正。

一,最终效果,

二,表结构

代码如下:

CREATE TABLE IF NOT EXISTS `books` (
  `id` int(8) NOT NULL auto_increment,
  `title` varchar(50) NOT NULL,
`vote_1` int(8) unsigned NOT NULL,
`vote_2` int(8) unsigned NOT NULL,
`vote_3` int(8) unsigned NOT NULL,
`vote_4` int(8) unsigned NOT NULL,
`vote_5` int(8) unsigned NOT NULL,
`avgrate` int(8) unsigned NOT NULL,
`AmountOfVotes` int(8) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(8) NOT NULL auto_increment,
  `username` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `votes` (
  `uid` int(8) unsigned NOT NULL,
  `bid` int(8) unsigned NOT NULL,
  `vote` int(1) NOT NULL,
  PRIMARY KEY (`bid`, `uid`)
) ;


三,设计思路

数据表分为两个部分,

1,第一个部分,表votes。其中uid和bid设为了主键,这样防止一个用户多次投票的情况;

查询时,可以使用,

代码如下:

平均分:SELECT avg(vote) FROM votes WHERE bid = $bid;

评价总数: SELECT count(uid) FROM votes WHERE bid = $bid;


如果有时间排序的需求,可以再增加一个时间戳字段。

2,第二部分,冗余部分

vote_1到vote_5,仅记录每一个级别评分的数量,有评分了则+1;

avgrate记录平均分;
AmountOfVotes记录总分;

其中avgrate和AmountOfVotes通过计算vote_1到vote_5得到,这样减少了对表votes的大量查询。

如果配合评论,那么评论中增加关联即可,

代码如下:


CREATE TABLE IF NOT EXISTS `comments` (
               `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
               `rating_id` INT(11)  UNSIGNED NOT NULL DEFAULT 0,
               PRIMARY KEY ( `id` )
)


四,继续优化需要思考的问题

votes表中的数据量会是book中数据量的N倍,这种设计也便于votes的分表,不影响快速查询。


    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 新年伊始,万象更新,拥有健康,拥有幸福,拥有梦想!
  • Linux里面,文件的拥有者应该是肯定会拥有R,W,X呀, 为什么实际上不是这样?
  • 能够让某一个用户拥有和root一样的权限么?
  • 将Sql Server对象的当前拥有者更改成目标拥有者
  • 更改sql server拥有者的方法
  • linux 中chgrp是改变文件群组的,那么文件拥有者的群组会不会一起改变
  • 求Linux下开发拥有USB通讯功能的资料
  • 如何编程使普通用户拥有访问/root目录的权限(即超级权限)
  • sql server 2005删除用户时“数据库主体在该数据库中拥有架构,无法删除”错误的解决办法
  • 使所有实现此接口(interface)的类拥有相同的构造器(contructor)?
  • debian下拥有所有权限却无法进行实际的执行权限
  • 使SQL用户只能看到自己拥有权限的库(图文教程)
  • Linux将首次拥有基于Kernel的配置模式 说的是什么啊 ~~
  • SQL Server提示"选定的用户拥有对象,所以无法除去该用户”
  • 基于html5的ssh客户端,开源堡垒机,你值得拥有 GateOne
  • 是否有人拥有JBuilder4或5的完整帮助文件?我搜索过论坛了,都不全。
  • 如果父进程有多个线程,那么它的子进程也该拥有这些线程
  • 怎样让普通用户拥有超级用户的权限,是把普通用户的组设为root组吗?具体怎么做,急死了
  • smp机器上,拥有自旋锁时睡眠的问题
  • 采用sudo,让B用户对某目录和下面所有的子目录拥有控制权


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3