我是数据库设计的初学者。我对a有点困惑 一对一的关系。
我有一个名为 task_tbl 的表格,我希望用户对任务进行评级(评分为5分,1到5星)。我对如何去做有点紧张;我应该创建另一个名为 rate_tbl 的表格,还是应该将其放在名为 rate 的列中的 task_tbl 中?该任务在数据库中只能有1个等级,从1到5。
这是我的 task_tbl :
CREATE TABLE `task` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(200) NOT NULL,
`description` VARCHAR(1000) NOT NULL,
`start_date` DATETIME NOT NULL,
`end_date` DATETIME NOT NULL,
`created_by` INT(11) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=13;
答案 0 :(得分:2)
您关于任务及其评级(我想您的意思是评级,而不是酒店的食物比率)。
因此,根据规范化,您应该创建另一个表格rating_table
,该表格的预定义值从0
到10
,因为评分介于0到10之间。
现在您需要另一个表tasks_ratings
,其中包含task_id
和rating_id
以及user_id
。
请参阅,将从rating_table
获取0到10的评级,该评级将在Web浏览器中显示给用户,他们的响应(他们给出的评级)将与user_id一起存储在tasks_ratings
表中,task_id和rating_id。
现在,如果您想通过从任务表中获取任务ID来计算avg()
表中的平均评级使用tasks_ratings
。
答案 1 :(得分:1)
如果1-1表示任何任务可能只有一个评级,那么就不需要其他表:
CREATE TABLE `task` (
...
`rating` int default 1,
constraint CK_Task_Rating check( rating between 1 and 5 )
)
如果您希望每个用户都能对任何任务进行评级,那么您还需要另一个表:
create table User_Task_Ratings(
UserID int not null references Users( ID ),
TaskID int not null references Tasks( ID ),
Rating int check( Rating between 1 and 5 ),
constraint PK_User_Task_Ratings primary key( UserID, TaskID )
);
因此,每个用户可以对任何任务给出一个评级。从技术上讲,这是用户和任务之间的多对多交集表。但从评级的角度来看,此用户可能只给那个任务一个评分。
如果你使用第二种方法,你仍然可以在任务表中有一个评级字段,例如,该字段可以包含该任务的所有用户评级的平均值。但是,我会创建一个视图来显示任务数据并计算平均值,并可能计算另一个字段,其中包含已评级任务的用户数。这样可以简化维护工作,因为您不需要保持视图同步。