0

编辑:标题很宽泛。作为“关系数据库设计的最佳解决方案,用户可以发布内容,并且可用字段会因内容类型而异”会更准确。

我正在开发一个用户可以发布不同类型内容的网站。所有帖子都有文本和与另一个相关的 feed_id 值(一个提要的许多帖子)。基于某些帖子仅包含文本的想法,最佳解决方案是什么?

到目前为止我想到的想法:

  • 为每个引用帖子的特殊类型添加一个表格,将未引用的帖子保留为文本帖子。

问题:如何查询纯文本帖子?

  • 为每种类型添加一个表格,包括文本帖子。

问题:似乎效率不高。对于在 text_posts 中找到的每个帖子,必须再次在帖子中找到该帖子才能获取文本字段。再说一次,对于像图片这样的特殊类型,情况已经如此。有没有合适的方法来通过 JOIN 完成这个?

  • 每个帖子条目中的外键到每个可以为空的特殊类型

问题:大量空字段,应用程序必须维护规则。

  • 表示帖子类型的字段

缺点:规则必须由应用程序维护(区分大小写,帖子应该只有一个有效的类型),更难查询亲:这个字段也可以代表相似内容的不同视图(即我可以为 post_type 设置一个名为“blog_entry " 这与文本帖子完全相同,但应用程序显示的内容不同)。不过,这个专业人士有点代码味道......

另外,如果有什么不同,我的应用程序是用 PHP 编写的。

编辑:似乎我的第一个解决方案“为每个引用帖子的特殊类型添加一个表格,将未引用的帖子保留为文本帖子”,如果我这样查询所有帖子,则可以正常工作:

SELECT posts.title, posts.text, picture_posts.id, picture_posts.src FROM posts
LEFT JOIN picture_posts
ON picture_posts.post_id=posts.id
ORDER BY posts.date DESC

然后应用程序的一些伪代码如下所示:

print(posts.title, posts.text);
if (picture_posts.id is not null) {
    showPicture(picture_posts.src);
}

我应该使用这个设计吗?

4

1 回答 1

1

这是一个非常开放的问题。如果您将此作为学术练习,我建议您阅读有关数据库规范化和数据库正常形式的内容。如果您这样做是为了创建一个功能性网站,听起来您是在从头开始重新发明几个轮子,您最好花时间寻找满足您需求的现成解决方案。

于 2013-07-16T18:08:01.983 回答