2015-05-23 188 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) 
); 

因此,每個用戶可以給任何任務一個評級。從技術上講,這是用戶和任務之間的多對多交集表。但從等級的角度來看,這個用戶可能會給出一個且只有一個等級任務。

如果使用第二種替代方法,您仍然可以在任務表中包含評分字段,該字段可能包含該任務的所有用戶評分的平均值。但是,我會創建一個視圖,以顯示任務數據並計算平均值,也可能計算另一個字段與已評估任務的用戶數。這樣可以簡化維護過程,因爲您無需保持視圖同步。