案例表设计(举例)
user : id | name | pw | ....
atc : id | title | ....
atc_tag : id | title | ...
atc_tag_ref : id | atc_id | atc_tag_id | ....
user_favor_atc_tag : id | user_id | tag_id | deleted | ...
目标
根据用户喜好查询文章列表
- 翻页逻辑
- 带用户喜欢标签的文章优先排序
实现方式
方案一
当数据量均很少时,可一次查询atc列表,然后比对其tag和用户favor_tag。
不建议:不管数据量多少,都应该按照完整模式来考虑问题,实际项目中既有可能atc是数据量大的一方,tag等也可能是数据量大的一方。
方案二
- 优先构建方法获取用户的喜欢的文章标签列表;
- 根据用户喜欢的标签列表查询包含此类标签的文章List<AtcId>
- 构建PageSearch方法A查询包含List<AtcId>的文章列表List<AtcFavored>,以及文章数量FavoredAtcCnt
- 构建PageSearch方法B查询不包含List<AtcId>的文章列表List<AtcUnFavored>,以及对应数量UnFavoredCnt
此处使用两个Atc表的查询方法在于,优先按照翻页逻辑查询带用户喜欢标签的文章,若在某一页时,用户喜欢的文章不满一页size<PageSize,这时候就需要调用B方法来查询不带用户喜欢标签的文章,来补足这一页数据。
后续思考
-
实际项目对于类似于标签服务的数据库设计,尽可能不要偷懒,而将tag作为属性加在Atc表中,不然在大量数据查询时,会造成效率低下;
-
实际项目中还需要考虑的问题诸如:Atc的创建时间问题、文章是否被收藏、文章的点赞数量等
网友评论