【问题标题】:single table inheritance (with Ebean + Play! framework)单表继承(使用 Ebean + Play! 框架)
【发布时间】:2012-09-21 14:26:08
【问题描述】:

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

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

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

【问题讨论】:

  • Martin Fowler 推荐 STI 而不是 CTI。当 TB 驱动器的价格为 60 美元时,您不必担心单个 smallint 或 tinyint 字段的空间需求。
  • 您能否发布指向 Martin Fowler 推荐的链接,@NeilMcGuigan?
  • @KirdApe 找不到适合您的链接,但我记得读过 Fowler 先生的一篇文章,指出他推荐 STI 作为最佳首选,尤其是对于敏捷开发。他并不是说 CTI 不好,只是说它更复杂而且速度有点慢。

标签: java database-design jpa playframework-2.0 ebean


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多