数据库设计问题

时间:2011-05-24 09:52:00

标签: database-design

我正在为一个应用程序设计一个数据库,用户可以对图片和评论进行评论。视频。

我应该为评论保留单独的表格,例如(Picture_comments& videos_comments)
或者我应该保留单表评论和其他映射表,如(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

哪一个更好的方法,为什么?

4 个答案:

答案 0 :(得分:2)

我会使用你的方法2,因为它更容易做“搜索所有评论”

之类的事情

答案 1 :(得分:1)

您可以只有一个表注释,其中一个字段将特定注释的类型。这基本上是选项2,没有映射,单个字段足以知道它是什么类型的注释。至于视频或图片ID,您可以将它们视为通用对象,消费者可以根据类型或注释或对象mime类型决定如何处理它们。这应该允许您将来添加更多类型的评论。

Comment
 id
 user_id
 comment_text
 comment_type
 linked_object_id

CommentObect
  id
  type
  object

答案 2 :(得分:1)

我会创建一个名为“Comment”的实体,并在该注释实体上添加与用户的关系映射。评论实体还将在一列上包含枚举值,表示其是用于图片还是用于视频。像 -

这样的东西
enum MimeType {
    PICTURE, VIDEO;
}

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

为什么我喜欢这种方法?因为它更干净,并且生成的实体会更少,而且我不必编写不同的查询来搜索不同类型的mime类型注释。由于评论是在差异表上,我可以懒散地加载它们。

答案 3 :(得分:0)

您只需要三个实体(如果您不包含用户实体,则需要两个实体)。

您的方法2意味着特定评论可能涉及多个图片或视频。这就是你想要的吗?

用户{one-to-many}评论{多对一}媒体(媒体类型)