簡體   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