使用SQL对基本社交网络进行父/子设计
我正在尝试为社交网络风格的应用程序构建一个简单的结构。但是我对如何设计使用SQL对基本社交网络进行父/子设计,sql,oop,foreign-keys,relationship,social-networking,Sql,Oop,Foreign Keys,Relationship,Social Networking,我正在尝试为社交网络风格的应用程序构建一个简单的结构。但是我对如何设计帖子、评论和媒体之间的关系有点困惑。 简单地说,媒体可以是图像或视频(带枚举)。它包含关于标准图像、缩略图和视频的size和URL信息(根据mediaType枚举)。post可以附加多个媒体。评论可能附带多个媒体。但是当一个媒体在一个地方使用时,它不能在另一个地方使用。没有其他post可以拥有它。任何其他注释都不能包含它。另外,当我实现用户时,他们可以引用图像类型媒体作为他们的个人资料。当有消息功能时,一些媒体可能会附加到消息
帖子
、评论
和媒体
之间的关系有点困惑。
简单地说,媒体
可以是图像
或视频
(带枚举)。它包含关于标准图像、缩略图和视频的size
和URL
信息(根据mediaType
枚举)。post
可以附加多个媒体
。评论
可能附带多个媒体
。但是当一个媒体在一个地方使用时,它不能在另一个地方使用。没有其他post
可以拥有它。任何其他注释
都不能包含它。另外,当我实现用户
时,他们可以引用图像类型媒体
作为他们的个人资料。当有消息
功能时,一些媒体
可能会附加到消息
等。因此,我希望事情有点灵活
我不想在多个表中添加关于thumbnailWidth
、thumbnailSize
、thumbnailURL
等的特定列,因为这样重复太多了。所以我决定使用一个集中的媒体
表来保存上传的图像或视频的所有主要信息。
我决定将缩略图和标准图像信息放在同一行,否则会觉得太复杂而无法处理。稍后我可以将图像
和视频
分开,以分开表格
注意:我没有一个评论相互回复的结构。这是后来的一个问题:)
这是当前的设计,没有媒体
和其他表之间的连接
Media
----------
id
thumbnail_width
thumbnail_height
thumbnail_URL
standard_width
standard_height
standard_URL
media_type ("video" or "image")
source_URL (only used if media_type is "video")
(maybe other columns to be used with "video" type)
user_id (who uploaded the media)
Post
----------
id
title
body
user_id (who sent the post.)
Comment
----------
id
body
post_id (which post has this comment)
user_id
选项1
因此,一个选项是,将commentId
和postId
字段(可为空)放入media
表中。
如果媒体已连接到帖子,请将帖子放在那里。如果它附加到注释,请对commentId
执行相同操作。如果其中一个有值,则其他值必须为null
。但这可能会导致media
表中的引用列过多,因为随着项目的发展,media
可能会在很多地方使用
选项2
另一个选项是为每个关系创建表,如
PostMedia
----------
id
post_id
media_id (unique. one-to-one relationship with Media table)
CommentMedia
----------
id
comment_id
media_id (unique. one-to-one relationship with Media table)
但现在,在保存评论之前,更难检查帖子中是否使用了媒体。或者反过来说。我们每次都需要检查整个PostMedia
表
另一种情况可能是,当用户将媒体
和图像
类型设置为他们的个人资料图片时,我们需要检查它是否用于帖子或评论中。我不确定这个约束,但在某些情况下它可能会派上用场
我可以在media
表中设置一些ownerType
枚举。这可能是post
,comment
,profilePic
等。只有当ownerType
为post
时,PostMedia
表才能引用媒体
选项3
集中的媒体
表格想法很酷,但我认为它有很多复杂性。使用面向对象的设计,我可能只需要创建一个抽象的media
类,将所有必需的列和方法放在该类中,并将其扩展为postdedia
,CommentMedia
等,这样会更容易处理,但最终会在数据库中产生许多相同的列和类似的表。我不知道这是不是一个好的设计
这里的最佳做法是什么?我可能觉得事情太复杂了,可能有更简单的解决方案。我愿意接受任何建议:)
谢谢 你熟悉实体关系模型和规范化过程吗?如果我需要可视化一些混乱或复杂的模式,我会经常使用ER模型。我不确定“正常化过程”。即使我使用过它,我也可能不知道它的名称:)“这里的最佳实践是什么?”写下所有已知的函数依赖项,并从中生成数据库模式。通过BCNF的所有范式都由它们的函数依赖关系决定。