单表继承(使用 Ebean + Play!框架)
-
11-12-2019 - |
题
我正在使用的概念 single table inheritance
当然是因为 OOP 的考虑。
例如, PostLike
和 TopicLike
继承自 Like
班级。
我发现这种方法存在两个问题:
- 我得到的是“一大表”的点赞,而不是两张表(PostLike 和 TopicLike)。
- 该表有一个额外的列,称为 数据类型 这使得记录识别成为可能(即类型)。从长远来看可能是 巨大的浪费 磁盘空间。不是吗?
我不是数据库专家,因此我想了解您对数据库设计的见解以及这两个问题是否至关重要。
解决方案
如果您只有一张表而不是两张表,则读取速度会更快,因为您将避免“连接”。但是您将使用更多空间,因为您将有一个额外的“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仅支持 “单表继承”。
不隶属于 StackOverflow