2012-09-30 73 views
4

我使用single table inheritance的概念,当然是因为OOP考虑。
例如,PostLikeTopicLike继承自Like类。
我看到两个问题的方法:的单表继承(使用Ebean + Play!框架)

  1. ,而不是两个表(类柱和TopicLike)我得到喜欢的“一台大桌”。
  2. 该表具有称为dtype的额外列,其允许记录标识(即类似的类型)。从长远来看,它可能是的磁盘空间的巨大浪费。不是吗?

我不是数据库专家,因此我想了解您对此数据库设计的见解以及这两个问题是否至关重要。

+3

Martin Fowler建议STI通过CTI。当TB级驱动器花费60美元时,您不应该担心单个smallint或tinyint域的空间需求。 –

+0

你可以发布一个链接到Martin Fowler recomendation,@NeilMcGuigan? – KirdApe

+0

@KirdApe找不到链接,但我记得读过Fowler先生的一篇文章,指出他推荐STI作为最佳首选,尤其是对于敏捷开发。他并不是说CTI不好,只是它更复杂,速度更慢。 –

回答

7

如果您只有一个表而不是两个表,读取速度会更快,因为您将避免“连接”。 但是,您将使用更多空间,因为您将有一个额外的“dtype”列和一些空列。

让我们来举个例子。这里是模型(不JPA注解):

public abstract class Like { 
    public Long id; 

    public String foo; 
} 

public class PostLike extends Like { 

    public String post; 
} 


public class TopicLike extends Like { 

    public String topic; 
} 

你会得到表Like

---------------------------------- 
|dtype | id | foo | topic | post | 
---------------------------------- 
|post | 1 | a | NULL | p1 | 
|topic | 2 | b | t1 | NULL | 
---------------------------------- 

正如你所看到的,对于“类柱”的项目,你将有一个NULL“主题”值。

但是时下,磁盘空间如果不是真正的问题。

我发现的单表继承的唯一缺陷是,如果您有很多属性,那么这些列的数量可能会很大,并且在模型中添加新的属性/列更加困难(如果您必须应用数据库演变)。

和AFAIK,ebean only supports“单表继承”。