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

5

出于面向对象编程的考虑,我正在使用单表继承的概念。
例如,PostLikeTopicLike都是从Like类继承而来。
我认为这种方法存在两个问题:

  1. 与其说有两个表(PostLike和TopicLike),不如说只有一个包含所有点赞信息的“大表”。
  2. 该表还有一个额外的列称为dtype,用于记录标识(即点赞类型)。从长远来看,这可能会造成巨大的磁盘空间浪费。不是吗?

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


3
马丁·福勒建议使用STI而非CTI。当一个1TB的硬盘只需花费60美元时,你不必担心单个smallint或tinyint字段所需的空间要求。 - Neil McGuigan
你能否给我发一下Martin Fowler的建议链接,@NeilMcGuigan? - KirdApe
@KirdApe 找不到相关链接,但我记得读到过 Fowler 先生的一篇文章,他推荐 STI 作为首选,尤其是对于敏捷开发。他并没有说 CTI 不好,只是它更复杂,速度稍慢。 - Neil McGuigan
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的“topic”值。

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

我唯一看到单表继承的缺点就是如果您有很多属性,则列数可能会非常大,并且难以向模型中添加新的属性/列(如果您必须应用数据库演进)。

据我所知,ebean仅支持“单表继承”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接