数据库设计一对一关系

时间:2015-05-23 13:17:12

标签: php mysql database oracle database-design

我是数据库设计的初学者。我对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;

2 个答案:

答案 0 :(得分:2)

您关于任务及其评级(我想您的意思是评级,而不是酒店的食物比率)。

因此,根据规范化,您应该创建另一个表格rating_table,该表格的预定义值从010,因为评分介于0到10之间。

现在您需要另一个表tasks_ratings,其中包含task_idrating_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 )
);

因此,每个用户可以对任何任务给出一个评级。从技术上讲,这是用户和任务之间的多对多交集表。但从评级的角度来看,用户可能只给那个任务一个评分。

如果你使用第二种方法,你仍然可以在任务表中有一个评级字段,例如,该字段可以包含该任务的所有用户评级的平均值。但是,我会创建一个视图来显示任务数据并计算平均值,并可能计算另一个字段,其中包含已评级任务的用户数。这样可以简化维护工作,因为您不需要保持视图同步。