首页 > 解决方案 > 保持多个表的评级

问题描述

让数据库设计具有两个以上代表主要实体的表,例如书籍、出版商、作者,我想找出对给定实体进行用户评级的最佳方法。

是否最好创建一个与上述表无关但仅用于用户表的表(向用户显示给定表记录的评分)并用 varchar 指示相关表的类型?

或者最好为每个表保留单独的评级表。

我的想法如下,但我不确定这是存储此类数据的最佳方式。

***rating table***
ObjectType
ObjectId
UserId
RatingScore

标签: mysqldesign-patternsrdbms

解决方案


根据您的描述维护评级表可能会减慢您的数据库。例如,只需考虑 100 万用户将为一本书提供评分。

因此,单本书实体将在您的评级表中有 100 万条记录。在进行平均评分时,您必须阅读这需要更多内存和时间的 100 万条记录。而是使用下表来确保计算以更少的时间和内存消耗工作。

Ratting_Table
Id: 
ObjectName: (Book,Author,Publisher)
ObjectId:(Id of Book,Author,Publisher entity) 
1Ratting_Count: 
2Ratting_Count:
3Ratting_Count:
4Ratting_Count:
5Ratting_Count:

保留 Book、Author、Publisher 实体的可用操作列表,如下所示。

Activity_Table 
Id:
Action: View, Rated, Ordered,etc.,

对于每个用户,记录他们的活动如下。

UserActivity_Table
Id
UserId   
ActivityId: Id from activity table.
ActivityJSON: 

对于 ActivityJSON,请为每个活动保留以下三个结构并将它们另存为 JSON 在您的审计表中

查看

{
    ObjectName: Book,Author,Publisher
    ObjectId: (Id of Book,Author,Publisher entity)
    ViewTime: 
}

评级

{
    ObjectName
    ObjectId
    Score
}

对于订购

{
    ObjectName
    ObjectId
    NumberOfOrders
}

实施此表系统后,在您的服务器端 API 中更新Ratting_Table. 如果用户要更新已评级实体的评级(如果启用此功能)进行审核并搜索同一实体的现有评级分数。然后将他的新评级审核为UserActivity_Table记录中的新条目并更新相应的实体行Ratting_Table


推荐阅读