数据库设计帮助 - 拆分表格

时间:2014-01-05 22:54:59

标签: mysql sql database database-design

我正在构建一个具有不同类型“帖子”的应用程序,用户可以根据自己的喜好插入尽可能多的内容。帖子虽然可以是不同类型的,例如图像帖子,视频帖子,文本帖子等......显然这些都将在数据库中具有不同的字段。一个例子是图像类型将具有:

Image
----------
date
image_url

和文章可能有:

Text
----------
date
title
content

现在,对于每种不同的类型,我是否有一个唯一的表,只是将用户链接到这些?假设这是正确的,如果我想按日期顺序显示它们,我是用JOIN做的,还是我完全走错了路。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

通过将继承层次结构映射到关系模式,自然地模拟您在此处执行的操作。

你想要的是获取所有帖子的所有常见元素(post_id,date_created,user_id等)以及type字段,然后将其作为“基础”表。此表代表所有posts,无论其具体类型如何。

接下来,您将获取每种类型帖子的所有特定属性,并为该特定类型创建一个表(这些是“子”表)。该表的主键也是基表中的外键(post_id)。

基表中的type字段引用帖子所属的特定表。

所以最终看起来像这样: Class Table Inheritance

现在你可以做各种各样的查询:

选择所有视频,按降序排序:

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与上述目的相同的列:

Single Table Inheritance

关键方面是特定于类型的列应该是可空的(因为对于不属于该类型的帖子,它们将为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数据库文件进行一些测试,并在投入生产之前进行测试。