一个表还是三个具有相同数据属性的三个独立对象?

时间:2009-12-10 04:35:26

标签: mysql ruby-on-rails database database-design data-modeling

我正在为一本杂志建立一个网站,其中包括三个不同的部分 - 文章,博客文章和评论。所有这三种对象类型都有以下共同列:标题,描述,标题,副标题,正文和作者。我应该将它们分别存储在自己的表中,还是应该创建一个Posts表并添加一个允许我区分['article','blog','review']的类别?

为了清楚起见 - 其中三个将以完全不同的视觉格式呈现给用户,因此它不仅仅是一个包含文章,博客和评论的类别或标签的博客。但它应该在幕后吗?

很难决定是否应该根据它们实际上是单独的对象来分割它们,或者将它们保持在一起以保持我的应用程序干燥。这会导致维修问题吗?性能问题?正常化?数据的完整性?我不是数据库人,所以非常感谢任何帮助。

我认为它根本不重要,但我正在使用Rails,所以我想弄清楚我是否会最终得到3个不同的控制器,3个模型和12个视图,其中我如果背后有充分的理由,我很乐意这样做。

提前致谢!

9 个答案:

答案 0 :(得分:3)

我建议添加一列来指明类型。如果你调用它类型,这将允许你移动到单表继承(also here),即使模型开始略有分歧。然后你最终会......

class Post < ActiveRecord::Base
class Article < Post
class Blog < Post
class Review < Post

在大多数情况下,你可以使用Post和一个Controller,但是然后使用继承来处理验证等特殊行为。

答案 1 :(得分:1)

如果它们之间的属性相同,则没有理由使用单独的表。

其中两个对象可以具有相同的属性,因此在这种情况下您将创建两个表。

答案 2 :(得分:0)

ONe表添加类别字段。

只要您确实确定此模型不会更改且实体类似,那么您将需要一个具有附加字段TypeID的表。然后,当您想要显示仅包含博客帖子的网格时,您只需添加WHERE条件WHERE TypeID ='blog posts'

答案 3 :(得分:0)

将外键添加到单独的类型表中可以轻松添加新类别。如果基于类型的行为没有不同,我会推荐它超过三个单独的对象。

答案 4 :(得分:0)

如果证明有必要的话,在以后分割表格要容易得多,而如果你将它们分开开始,那么组合表格可能会同时添加单独的字段。我将从统一的方法开始。

答案 5 :(得分:0)

使用3个不同的表,因为这三个表的性质/行为是不同的 总是试图远离冗余,但我不认为在这种情况下它是冗余。

使用单独表格的原因:

1)很可能你很快就会在每个表中添加更多的列,并且每个表都会有不同的列。如果您现在使用单个表格,您将在一个表格中容纳所有这些表格,使其变得混乱。

2)如果桌子快速增长,你在速度,锁定,尺寸等方面的问题会更少。

此外,它还为时过早担心..只需写下来......一个月后重构它!

答案 6 :(得分:0)

一张表,还会查看问题/答案 to use sub-type or not ;非常相似。

答案 7 :(得分:0)

我的问题是你打算如何查询它们?您是否需要同时获取所有三种类型的信息?如果您需要所有三种类型的数据,单个表将更容易设计查询。如果需要,您可以将所有公共字段放在一个表中,稍后添加专业表以获取所有三个不常见的信息,或者如果不使表太宽则为此信息添加可空字段。如果它们永远不会被一起查询,那么这三个表可能是一个更好的主意,因为它允许您更灵活地更改一个表的结构。

答案 8 :(得分:0)

这是一个称为“泛化专业化”的模式的例子。

对象模型的任何处理都将从面向对象的角度来涵盖gen-spec。从关系的角度来看,获得良好的待遇会更加困难。

如果你在谷歌上进行“泛化专业化关系建模”,那么你将会收到几篇关于这个主题的好文章。我不能确切地说出你的情况下最好的设计是什么,但我怀疑这将是一个具有所有共同属性的表,以及每个专用项的单独表。对于专用表,您不需要单独的id列。只需引用每个专用表中的公共id字段,并使此FK也成为其自己的表的PK。

我所指的文章将为这种设计提供更完整的理由。 YMMV。