数据库设计 资源表与资源收藏表的设计

项目中有一个功能。 就是记录资源的的评分数,收藏,点赞类似的功能。其中不同的开发人员对相似的功能做了不同的设计。就以 A,B,C 来代替吧。下面我以收藏数作为实例进行说明。
资源表 tb_d_resource
CREATE TABLE tb_d_resource (
ID int(11) NOT NULL AUTO_INCREMENT,
NAME varchar(50) DEFAULT NULL,
URL varchar(100) DEFAULT NULL,
CREATE_TIME datetime DEFAULT NULL,
PRIMARY KEY (ID)
)
收藏表 tb_d_collection
CREATE TABLE TB_D_COLLECTION (
ID int NOT NULL AUTO_INCREMENT ,
RID int NOT NULL ,
UID int NOT NULL ,
CREATE_TIME datetime NULL ,
PRIMARY KEY (ID)
)
;
A 方案:
通过left join 关键字 直接在数据库统计出来返回给前台
SELECT
ID,
NAME,
URL,
COUNT_COLLECTION ‘收藏数统计’
FROM
tb_d_resource r
LEFT JOIN (
SELECT
RID,
COUNT(RID) COUNT_COLLECTION
FROM
tb_d_collection
GROUP BY
RID
) CC ON R.ID = CC.RID
LIMIT 0,10

方案B
将查询资源列表的sql 和统计资源收藏数的sql 分开写,能后通过java 代码进行数据合并。
查询资源sql: SELECT ID, NAME, URL FROM tb_d_resource r LIMIT 0, 10
查询具体资源的收藏数sql : select count(RID) ‘收藏数’ FROM tb_d_collection where rid=’资源id’
通过查询资源sql 里面返回的数据,能后在去调用统计的sql 语句,并把统计的结果拼接到集合中返回给前台

方案C
在资源表加一个收藏总数的属性 collections 来记录收藏总数,当用户发生了收藏、取消收藏的行为时同时对资源表的数据进行+/-1 。 这样实时的把统计数据记录在资源表,页面在做展示的时候可以直接把相关信息展示出来,而不通过与收藏表的关联或者是在java 代码层进行拼装。

个方案的优缺点
A:
优点 : 简单方便,所需的数据一条sql 语句搞得
缺点: 在做收藏统计的时候一次把所有资源的收藏数都统计出来了,性能差

B:
优点: 一次只统计所需资源的收藏数,没有不必要的操作,性能快
缺点: 需要循环调用统计的sql据库的性能(当能一般也不会出现分页太大的情况,基本可以不考虑这个因数)
C
优点: 方便,也是一条sql 搞定所有数据,性能最快
缺点: 需要在资源表添加一个新的字段,同时在添加收藏和删除收藏的时候要也要实时的更新资源表里面 collections 属性的值,繁琐。
其中这个方案还需要考虑数据强一致性的问题,因为统计数据不是实时的从统计表里面统计出来的,所以有时候会出现两边数据不一致的问题(运维人员手动删除了收藏表里面的数据,或者手动改动了资源表的统计数据)
上就是本人以以及团队成员在做相似功能出现的三种方案。各有优劣,其中本人更推荐使用方案B

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值