博客架构设计

3
我正在自学Rails,并希望构建一个类似Tumblr的博客。它将有几种不同的帖子类型,例如文本、照片、音频和视频帖子。
我的初步想法是为每种类型的帖子创建不同的模型,因为每种类型的帖子都有不同的规则。然而,我还在学习中,不知道我不知道的事情,所以也许有更好的方法(可能只需要一个帖子模型,和一个帖子类型的表格?)。
欢迎提供任何反馈。

以下两个答案听起来都很合理。我想提醒大家要记住的唯一一件事是,Rails 模型和数据库之间的许多“魔法”都与遵循约定(约定优于配置)有关,如果您尝试在同一张表上使用两个模型,可能会出现问题。 - user483040
我正在思考如何制作一个简单的博客平台以及如何设计它。我打开了SO,发现你的问题排在最前面! :) - bassneck
2个回答

4
很可能一个良好的关系型数据库和面向对象设计是拥有一个主要的文章模型,它可能会与所有类型的文章共享大部分相同的属性和行为。这甚至可以作为您的“文本”类型文章。
这也可以简化与帖子的关系(例如:“用户有许多帖子”与“用户有许多文本帖子和/或视频帖子和/或等等”)。
然后有一种“附件”连接表,确定附件的类型(因此您可以为每个帖子添加多个附件)。
CREATE TABLE attachments (post_id, media_type, media_id)

然后为每种类型的特定行为和媒体类型的处理程序创建表格和模型。

CREATE TABLE audios (id, transcription, storage);
CREATE TABLE videos (id, location, format, storage);

这可能需要某种多态关系,尽管这可能会引起对数据库设计的争议...你需要视图和触发器来轻松查询和维护完整性...但Rails可以很好地处理它。 post模型应该具有:
has_many :attachments

附件将会

belongs_to :post
belongs_to :media, :polymorphic => true

每个媒体模型都会有自己的特点。
has_one :attachment, :as => :media

然后您可以通过以下方式访问您的媒体:

post.attachments[0].media

如果您只需要每篇文章一种类型的媒体,可以跳过附件表并将属性与帖子表合并。抱歉我一直在编辑,我一直在想要说的更多的事情 :)

嗨Janechii,感谢您的回答,不用担心编辑的问题:) 我有些困难,无法确定您的答案如何工作...我是否需要一个帖子表,其中包含基本共享特征,例如user_id和title,然后为每种类型的媒体(音频、视频等)创建单独的模型,然后在附件表PostMedia中,它将有一个帖子和一个媒体类型? - Solomon
我已经编辑了答案...它有点复杂,但我认为会允许很多灵活性。你可以在任何Rails教程中阅读更多关于多态关系的内容。 - janechii
谢谢janechii,如果我每篇文章只想要一种媒体类型,我该怎么做呢?根据我对多态关系的研究,它们主要用于子属性(例如多个模型上的评论),而不是父属性(帖子有多个媒体)。或者我应该把Post表视为子属性来处理? - Solomon
很抱歉回复晚了。你可以在帖子模型中定义多态,而不是我提到的附件。这将为您提供每个帖子一个媒体。从技术上讲,帖子应该是媒体类型之一的“子级”,因此它应该是准确的表示。 - janechii

2
这里有几个可行的选项。
首先,您可以创建一个模型,其中包含“text_content”、“video_link”、“photo_link”等列。
然后,在视图中,根据哪些属性具有值,您可以呈现帖子的视图(可能使用部分视图)以不同的外观呈现给用户。
第二个选项是创建一个较小的“Post”表,只包含关键信息,并使用一系列“has_one”关系到其他项目。
我认为第二个选项的唯一优点是,由于您不必反复表示空单元格,因此您的DB表会更小。 除非您担心某些巨大的扩展问题,否则我会选择第一个选项。

谢谢你回答,布莱恩!各个帖子还有一些其他独特的方面可能会有所不同。例如,文本帖子可能有大量文本,而照片帖子则只有有限大小的标题。你能详细说明一下你的第二个选项吗? - Solomon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接