繁体   English   中英

数据库设计一对一关系

[英]Database Designing One-to-One Relationship

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

我有一个名为task_tbl的表,我希望用户对任务进行评级(评级为5,1到5星)。 我对如何去做有点紧张; 我应该创建另一个名为rate_tbl的表,还是应该将它放在task_tbl中名为rate的列中? 该任务在数据库中只有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;

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

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

现在你需要另一个表tasks_ratings ,它们将包含task_idrating_id以及user_id

请参阅,评级从0到10将从rating_table中获取,这将在Web浏览器中显示给用户,他们的响应(他们给出的评级)将存储在tasks_ratings表中,其中包含user_id,task_id和rating_id。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM