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

产品数据库设计时,经常遇到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的分表,不影响快速查询。

时间: 2024-08-30 19:31:20

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

Activiti数据库表结构(表详细版)

Activiti数据表结构 1  Activiti数据库表结构 1.1      数据库表名说明     Activiti工作流总共包含23张数据表,所有的表名默认以"ACT_"开头. 并且表名的第二部分用两个字母表明表的用例,而这个用例也基本上跟Service API匹配. u  ACT_GE_* : "GE"代表"General"(通用),用在各种情况下: u  ACT_HI_* : "HI"代表"History

关系型数据库表结构设计规范-浅谈(转)

  数据库表结构设计规范-浅谈,为啥是浅谈呢,因为主要的观点还是来自原微信公共账号的一篇文章,稍微加了一些自己的看法.   谁来进行数据库的设计? 肯定是具体的开发工程师来进行,开发同学的话,第一业务熟悉度比较高,第二结合OO和ORM的思想,能有比较好的运用关系型数据库的特性.如果是DBA同学的话,虽然对于数据库本身了解比较多,但是对于业务了解较少,很难有比较客观的设计.但是业务上线或者运行期间,需要DBA同学能够重度的加入进来,针对一些性能点和不合理的点进行优化,同事也可以在上线前,针对SQL

针对复杂的多级栏目该如何设计数据库表结构?

问题描述 针对复杂的多级栏目该如何设计数据库表结构? 比如可能存在如下几种情况: 主栏目1-->子栏目2-->子栏目3-->内容列表-->内容 主栏目2-->子栏目2-->内容列表-->内容 主栏目3-->内容列表-->内容 如果说为了开发和后期维护的方便,以及后期新的内容添加或删除方便,栏目表应该如何设计比较符合规范? 比如栏目按照一定规则拼接放到一个字段里: 主栏目1|子栏目11|子栏目111 主栏目2|子栏目21|子栏目212|子栏目2121 或

银行项目开发-开发银行项目,如何使开发人员看不到数据库表结构依然能够开发?

问题描述 开发银行项目,如何使开发人员看不到数据库表结构依然能够开发? 开发银行项目,如何使开发人员看不到数据库表结构依然能够开发?对于敏感信息是不能外泄 解决方案 自己封装操作数据库的接口,对外只暴露外包人员能看到需要用的接口,就可以屏蔽他们对数据库信息的查看了

关于权限管理数据库表结构的设计问题

问题描述 关于权限管理数据库表结构的设计问题 我们的需求是: 1. 创建不同的用户,可以分配不同的角色 2. 每个角色都可以自由分配不同的权限, 也可以创建新的角色,分配相应的权限 3. 权限细化到每一个菜单(共有三级菜单,细化到第三级的菜单) 单纯用 user表 role表 right表 user_role表 user_right表 五张表 可以实现吗? 具体应该怎样设计呢? 没有金币,希望大家帮帮忙~~~ 解决方案 http://www.cnblogs.com/leoxie2011/arch

数据库表结构更改,求大神!!

问题描述 数据库表结构更改,求大神!! 我现在要给一张表更改一个索引,由于表中的数据量过大,加这个索引需要半个小时,请问在此期间,会不会影响系统运行呢,因为这个索引对系统运行效率非常重要,如果没有这个索引,系统的部分功能将会超时. 解决方案 当然会有影响. 你可以先切一个备份,在备份里面加好索引,然后再切回来.

mysql-有数据库表结构,但是属性太多,如何自动导入建表

问题描述 有数据库表结构,但是属性太多,如何自动导入建表 项目要建好多表,但是属性太多,MySQL中手工做太麻烦求助各位大神有没有可以借鉴的方法啊? 解决方案 有一些代码生成器可以试试看. 另外还有PowerDesigner,可以以图形的方式设计表结构,自动产生sql. 解决方案二: 做数据库设计当然是要用建模工具了,设计完成后可以批量的生成脚本,这样是很清晰和方便的. 最常用的是powerdesign或者erwin 1.结构清晰,各表的结构和之间的关系一目了然 2.便于存档,如果哪一天谁向你索

erwin如果导出数据库表结构为xml格式文件

问题描述 erwin如果导出数据库表结构为xml格式文件 erwin如果导出数据库表结构为xml格式文件,现已经连接oracle数据库 导入表显示模型了,我需要erwin这些表结构用于数据采集 解决方案 http://blog.itpub.net/134308/viewspace-140582/ 解决方案二: 用powerdesigner可以搞 解决方案三: 谢谢 我已经导出来文件啦 erwin里面有save as 点击可以保存为xml格式的文件 供大家分享

架构师-如何创建一个不容被修改的数据库表结构?

问题描述 如何创建一个不容被修改的数据库表结构? 我想学习创建数据库表结构,但是不知道如何下手,求大神解答 刚才的问题有歧义,我修改了下. 然后声明下: 我会用数据库建模工具 我就是不太明白如何创建一个好的数据库结构,一个不容易被修改的结构,一个高效的结构 -------------------分割线----------------------- 如果让你们创建表结构你们如何创建呢?求思路~ 解决方案 不存在什么不容易被修改的表结构.首先你的程序决定了修改还是不修改. 如果你不信任你的程序,你可