数据库设计一对一关系
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
,它们将具有从 0
到 10
的预定义值,因为评分介于 0 到10.
现在您需要另一个 table tasks_ratings
,它将包含 task_id
和 rating_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 中有一个评级字段,其中可以包含,比如说,该任务的所有用户评级的平均值。但是,我会创建一个视图来显示任务数据并计算平均值,可能还有另一个字段,其中包含对任务进行评级的用户数量。这简化了维护,因为您不需要保持视图同步。
我是数据库设计的初学者。我有点困惑 一对一关系。
我有一个名为 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
,它们将具有从 0
到 10
的预定义值,因为评分介于 0 到10.
现在您需要另一个 table tasks_ratings
,它将包含 task_id
和 rating_id
以及 user_id
。
请参阅,将从 rating_table
获取 0 到 10 的评分,这将在网络浏览器中显示给用户,他们的响应(他们给出的评分)将存储在 tasks_ratings
table 与 user_id , task_id 和 rating_id.
现在,如果您想计算平均评分,请使用 tasks_ratings
table 中的 avg()
,方法是从任务 table.
如果 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 中有一个评级字段,其中可以包含,比如说,该任务的所有用户评级的平均值。但是,我会创建一个视图来显示任务数据并计算平均值,可能还有另一个字段,其中包含对任务进行评级的用户数量。这简化了维护,因为您不需要保持视图同步。