单表继承(使用Ebean + Play!框架)

时间:2012-09-30 12:56:03

标签: java database-design jpa playframework-2.0 ebean

我正在使用single table inheritance的概念,因为当然是OOP考虑因素 例如,PostLikeTopicLike继承自Like类 我发现这种方法存在两个问题:

  1. 而不是两张桌子(PostLike和TopicLike)我得到了喜欢的“一大桌子”。
  2. 此表有一个名为 dtype 的额外列,它可以识别记录(即类似的类型)。从长远来看,它可能是磁盘空间的巨大浪费。不是吗?
  3. 我不是数据库专家,因此我想了解这个数据库设计的见解以及这两个问题是否至关重要。

1 个答案:

答案 0 :(得分: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 |
----------------------------------

正如您所看到的,对于“PostLike”项目,您将拥有NULL“主题”值。

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

我看到单表继承的唯一缺陷是,如果你有很多属性,列数可能很大,并且在模型中添加新属性/列更难(如果你必须应用一个数据库演变)。

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