5

我使用的概念single table inheritance当然是出于 OOP 的考虑。
例如,从PostLikeTopicLike继承Like
我发现这种方法有两个问题:

  1. 而不是两张表(PostLike 和 TopicLike),我得到了“一张大桌子”的赞。
  2. 该表有一个称为dtype的额外列,它启用记录标识(即类似的类型)。从长远来看,这可能会浪费大量磁盘空间。不是吗?

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

4

1 回答 1

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只支持“单表继承”。

于 2012-09-30T13:08:16.110 回答