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

  1. 我得到的是“一大表”的点赞,而不是两张表(PostLike 和 TopicLike)。
  2. 该表有一个额外的列,称为 数据类型 这使得记录识别成为可能(即类型)。从长远来看可能是 巨大的浪费 磁盘空间。不是吗?

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

有帮助吗?

解决方案

如果您只有一张表而不是两张表,则读取速度会更快,因为您将避免“连接”。但是您将使用更多空间,因为您将有一个额外的“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“主题”值。

但如今,磁盘空间并不是一个真正的问题。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top