我正在为一个应用程序设计一个数据库,用户可以对图片和评论进行评论。视频。
我应该为评论保留单独的表格,例如(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
哪一个更好的方法,为什么?
答案 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}评论{多对一}媒体(媒体类型)