我使用的概念single table inheritance
当然是出于 OOP 的考虑。
例如,从PostLike
类TopicLike
继承Like
。
我发现这种方法有两个问题:
- 而不是两张表(PostLike 和 TopicLike),我得到了“一张大桌子”的赞。
- 该表有一个称为dtype的额外列,它启用记录标识(即类似的类型)。从长远来看,这可能会浪费大量磁盘空间。不是吗?
我不是数据库专家,因此我想了解您对这个数据库设计的见解,以及这两个问题是否至关重要。
我使用的概念single table inheritance
当然是出于 OOP 的考虑。
例如,从PostLike
类TopicLike
继承Like
。
我发现这种方法有两个问题:
我不是数据库专家,因此我想了解您对这个数据库设计的见解,以及这两个问题是否至关重要。
如果您只有一张表而不是两张,则读取速度会更快,因为您将避免“连接”。但是您将使用更多空间,因为您将有一个额外的“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只支持“单表继承”。