2011-05-24 121 views
3

我正在爲應用程序設計一個數據庫,其中用戶可以對圖片進行評論&視頻。
數據庫設計問題

我要保持獨立的表像(Picture_comments & videos_comments)評論
OR
我應該保持單個表徵求意見等映射表像(picture_comment_mapping & video_comment_mapping)。

哪一個會更好,爲什麼?

詳細
方法1:

user 
    id 
    name 

Picture 
    id 
    link 
video 
    id 
    link 

comment_video 
    id 
    user_id 
    video_id 
    comment 
comment_picture 
    id 
    user_id 
    picture_id 
    comment 

方法2:

user 
    id 
    name 

picture 
    id 
    link 
video 
    id 
    link 

comment 
    id 
    user_id 
    comment 

comment_picture_mapping 
    id 
    comment_id 
    picture_id 
comment_video_mapping 
    id 
    comment_id 
    video_id 

哪一個是更好的方法,爲什麼?

回答

1

我將製作一個名爲「Comment」的實體,並在該評論實體上添加與用戶的關係映射。評論實體還將在一列中包含枚舉值,說明其是用於圖片還是用於視頻。類似 -

enum MimeType { 
    PICTURE, VIDEO; 
} 

class Comment { 
    @ManyToONe 
    private User user; 
    @Enumerated 
    private MimeType mimeType; 
} 

爲什麼我喜歡這種方法?因爲它更乾淨,而且生成的實體會更少,並且我不必編寫不同的查詢來搜索不同類型的MIME類型註釋。由於評論是在差異表上,我可以加載他們懶惰。

+0

我使用了這種方法,因爲符合註釋條件的對象是固定的,所以枚舉將很容易解決這個問題。此外枚舉將更快,表的數量也將減少(從而減少連接數) – 2011-06-01 20:06:01

1

您可以只有一個表註釋其中一個字段將特定註釋的類型。這基本上是選項2,沒有映射,單個字段就足以知道它是什麼類型的評論。至於視頻或圖片ID,您可以將它們視爲通用對象,並且消費者可以根據類型或註釋或對象MIME類型決定如何處理它們。這應該允許您在將來添加更多類型的評論。

Comment 
id 
user_id 
comment_text 
comment_type 
linked_object_id 

CommentObect 
    id 
    type 
    object 
+0

如果我使用ENUM,則設計不會是關係。 – 2011-05-24 10:40:17

2

我會用你的方法,2號,因爲它更容易然後做這樣的事情「搜索所有評論」

0

你只需要大約三個實體(或兩個,如果你不包括用戶實體)。

你的方法2意味着一個特定的評論可以是關於多個圖片或視頻。那是你要的嗎?

用戶{一個一對多}評論{多到一個}媒體(媒體類型)

+0

不,我不想這樣。我想每個對象一個評論' – 2011-05-26 05:24:42

+1

我會說,唯一的方法2意味着,關於類型A的評論與關於B的評論具有相同的形式,他們這樣做。 – Matt 2011-05-30 09:30:56

+0

對不起,我不這麼認爲。已糾正它。 @RAHUL:我認爲你的意思是「每個評論一個對象,零個,每個對象一個或多個評論」 – user212102 2011-06-04 11:42:28