数据库:多个表还是只有一个表?

时间:2010-07-11 13:40:49

标签: database performance database-design comments

For example 我有photosvideos个表,我可以对这些进行评论,但是当我将它发送到数据库哪个方式更好?

  1. 要有2个评论表: photo_commentsvideo_comments

  2. 或者有一张表comments和 在表格中创建一行就像 type并放在那里,如果是的话 photo_commentvideo_comment

  3. 我认为1更快,因为当我需要查询表格时数据较少,但2可能更容易使用。

    请让我知道什么是最好的方式,速度对我来说非常重要。

    我说的是一个拥有数百万条数据,数百万条评论的非常大的系统,所以我希望以最快的方式获得结果,对我来说无关紧要,如果我需要更多代码或需要请记住加号中的结果,结果更为重要!

6 个答案:

答案 0 :(得分:7)

如果您确实有两个单独的数据表photosvideos,我总是会选择使用两个单独的注释表。

为什么?

如果将所有注释放在单个comments表中,但引用来自两个单独数据表的媒体,则无法在注释表和两个数据表之间轻松设置参照完整性。有一些解决方法(比如有两个单独的引用字段,每个引用字段一个),但没有一个真正非常引人注目。没有参照完整性将最终导致不属于任何现有媒体条目的“僵尸”数据。

有两个注释表允许每个注释表正确引用其关联的数据表,因此数据库中的数据完整性会更好。

因此,如果您有两个单独的数据表,我总是会选择使用两个单独的注释表。

答案 1 :(得分:4)

这取决于照片和视频的结构。请考虑以下数据库设计:

MediaType
----------
ID *
Name

Media
----------
ID *
TypeID
OwnerName
Name
Size
Path

Photo
----------
MediaID *
MediaTypeID (constraint, always set to the photo type)
Height
Width

Video
---------
MediaID *
MediaTypeID (constraint, always set to the video type)
Rating

如果Photo和Video都有一个FK到MediaType和媒体,我会使评论与媒体表而不是任何一个相关,而不是直接与照片或视频表相关。这通常是我在Photo和Video具有许多常见属性时使用的设计类型。当您想要执行安全性操作时,它尤其有用,因为您没有在您正在处理的每种类型的媒体上重复相同的可见性和所有权构造。它的查询速度也非常快,因为许多查询通常只查找公共属性,或者只查找特定于类型的行,因此不需要包含某些表。通过对这些IS-A关系建模来设计数据库也可以使您的索引具有高选择性,这意味着速度

如果你被锁定在你的设计中,而视频和照片没有通用的“基表”,那么我会为每个人制作一个单独的评论表。

答案 2 :(得分:0)

分割表格会更好,因为您不必查询额外的“评论类型”列。以这种方式做事的缺点是不重用代码(如果你将评论添加到其他东西,可能在未来)。但这听起来并不像你那么担心。

答案 3 :(得分:0)

为什么不只有一个评论表?视频评论或照片之间是否存在差异?如果不是,您应该只有一个列,其中包含评论所针对的视频/照片的外键以及一个类型为ENUM的附加列,其中包含评论所针对的资源类型的信息。

使用ENUM可以非常快速地保存您的查询(因为它保存为数字),并且可以在查询中轻松使用字符串。

答案 4 :(得分:0)

我认为选择是否有1或2个评论表会对您的应用程序的性能产生任何明显的影响。

您应该选择在您的申请环境中更有意义的人。

例如,如果对照片的评论和对视频的评论都以相同的方式行事,那么您应该有一个表格,但是如果(例如)对视频的评论被允许的时间是照片评论的两倍或者对照片的评论有一个额外的“排名”字段或其他东西,那么2个表会更有意义。

答案 5 :(得分:0)

您的查询将显示为

select * from comments where linked_id = 555

select * from comments where linked_id = 555 and comment_type = 1

(评论类型= 1表示视频)。

只要注释类型作为索引,它们基本上就会一样快。

我唯一能考虑的是列。如果视频评论与图片评论有不同的评论集,请将其拆分。如果一切都是一样的话,那就把它们放在一起吧。