我正在构建一个具有不同类型“帖子”的应用程序,用户可以根据自己的喜好插入尽可能多的内容。帖子虽然可以是不同类型的,例如图像帖子,视频帖子,文本帖子等......显然这些都将在数据库中具有不同的字段。一个例子是图像类型将具有:
Image
----------
date
image_url
和文章可能有:
Text
----------
date
title
content
现在,对于每种不同的类型,我是否有一个唯一的表,只是将用户链接到这些?假设这是正确的,如果我想按日期顺序显示它们,我是用JOIN
做的,还是我完全走错了路。
提前感谢您的帮助!
答案 0 :(得分:2)
通过将继承层次结构映射到关系模式,自然地模拟您在此处执行的操作。
你想要的是获取所有帖子的所有常见元素(post_id,date_created,user_id等)以及type
字段,然后将其作为“基础”表。此表代表所有posts
,无论其具体类型如何。
接下来,您将获取每种类型帖子的所有特定属性,并为该特定类型创建一个表(这些是“子”表)。该表的主键也是基表中的外键(post_id)。
基表中的type
字段引用帖子所属的特定表。
所以最终看起来像这样:
现在你可以做各种各样的查询:
选择所有视频,按降序排序:
SELECT post.*, video.*
FROM post JOIN video USING(post_id)
WHERE post.type = 'video'
ORDER BY post.date_created DESC
为单个用户选择仅包含基本详细信息的所有帖子:
SELECT post.* FROM post WHERE user_id = ?
多态查询(为单个用户选择所有帖子,具有特定类型详细信息):
SELECT p.*, i.*, t.*, v.*
FROM post p
LEFT JOIN image i ON (p.post_id = i.post_id)
LEFT JOIN text t ON (p.post_id = t.post_id)
LEFT JOIN video v ON (p.post_id = v.post_id)
WHERE p.user_id = ?
此模型为您提供了极大的灵活性,但代价是查询复杂性更高,查询性能更低。如果你的视频,文字和图片帖子的数量相差足够少,你可以通过实现一些调用单表继承来获得更好的性能:一个表包含所有子类的所有列加上{{1与上述目的相同的列:
关键方面是特定于类型的列应该是可空的(因为对于不属于该类型的帖子,它们将为null)。此模型在空间中更浪费,但您可以运行上述所有相同的查询而无需子表连接(实际上这些表已默认连接),从而产生更快,更简单的查询。
答案 1 :(得分:1)
虽然你可以为每种帖子类型设置单独的表格,但我想不出任何理由反对只使用一个表格:
帖子
post_id
post__type -- Ex. 1: Text ,2: Image ,3: Video .
post__user_id
post__datetime
post__title -- Images and Videos probably could have titles as well .
post__content -- This gets meaning based on post__type . Ex. This would be a URL if post__type is Image or Video .
post__deleted
post__likes_count
答案 2 :(得分:0)
是的,对于每种类型的内容都有一个表,每个表上都有一个用户id列,然后当你显示数据时,你会编写select语句来创建连接。然后,您可以按日期,按用户,按日期和内容类型显示。
使用sqlite数据库文件进行一些测试,并在投入生产之前进行测试。