数据库设计一对一关系

Database Designing One-to-One Relationship

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

我有一个名为 task_tbl 的 table,我希望用户对任务进行评分(评分为 5、1 到 5星星)。我对如何去做有点紧张;我应该创建另一个名为 rate_tbl 的 table,还是应该将其放在 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;

您正在关联任务及其评分(我想您指的是评分,而不是酒店的餐饮费率)。

因此,根据规范化,您应该制作另一个 table 和 rating_table ,它们将具有从 010 的预定义值,因为评分介于 0 到10.

现在您需要另一个 table tasks_ratings,它将包含 task_idrating_id 以及 user_id

请参阅,将从 rating_table 获取 0 到 10 的评分,这将在网络浏览器中显示给用户,他们的响应(他们给出的评分)将存储在 tasks_ratings table 与 user_id , task_id 和 rating_id.

现在,如果您想计算平均评分,请使用 tasks_ratings table 中的 avg(),方法是从任务 table.

中获取任务 ID

如果 1-1 是指任何任务可能只有一个评级,则不需要其他 table:

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

如果您希望每个用户都能对任何任务进行评分,那么您还需要另一个 table:

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

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

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