[英]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
,其預定義值從0
到10
因為評級將介於0到10之間。
現在你需要另一個表tasks_ratings
,它們將包含task_id
和rating_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.