2015-05-23 130 views
1

我是数据库设计的初学者。我有点困惑于一对一的关系。数据库设计一对一关系

我有一张名为task_tbl的表格,我希望用户对任务进行评分(评分将在5,1到5星之外)。我对如何去做有点紧张;我应该创建另一个表叫rate_tbl,或者我应该把它放在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

1:1很少需要。 –

回答

2

你有关任务和评级(我想你指的评级,不是酒店里食物的比率)。

所以按照标准化,你应该让另一个表,rating_table这将有预定义值从010的评级将0分至10

现在你需要另一个表tasks_ratings这将有task_id之间在rating_iduser_id

看到,从0至10等级将从rating_table将被显示在web浏览器的用户取出,和它们的响应(他们给出的等级)将与USER_ID,TASK_ID和rating_id被存储在tasks_ratings表。

现在,如果要从tasks_ratings表中通过从任务表中获取任务ID来计算平均评级使用avg()

+0

主席先生,我不是在谈论美元利率,我说的是当用户点击第二颗星时,应该在数据库中存储2,如果他点击5号星,那么它应该在数据库中存储6。 – usama

+0

@usama,那么你应该已经清除它的问题。反正检查更新的答案。 –

+0

先生在这里你正在创造第三张桌子,那么这意味着它将成为多对多关系是正确的先生...如果是的话那么我们为什么要这样做?为什么我们要创建第三个表格?我们不能在评级表中添加userid和taskid,因此它将成为一对一的关系。 – usama

1

如果1-1你的意思是,任何任务可能有一个且只有一个等级,则不需要其他表:

CREATE TABLE `task` (
    ... 
    `rating`  int default 1, 
    constraint CK_Task_Rating check(rating between 1 and 5) 
) 

相反,如果你希望每个用户能够评估任何任务( s),那么你需要另一个表:

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) 
); 

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

如果使用第二种替代方法,您仍然可以在任务表中包含评分字段,该字段可能包含该任务的所有用户评分的平均值。但是,我会创建一个视图,以显示任务数据并计算平均值,也可能计算另一个字段与已评估任务的用户数。这样可以简化维护过程,因为您无需保持视图同步。