【问题标题】:Hibernate: table per concrete class vs. table per subclassHibernate:每个具体类的表与每个子类的表
【发布时间】:2011-10-30 15:24:41
【问题描述】:

我正在为我当前的项目 (Java) 计划/设计我的数据库。对于这个项目,我将使用 hibernate。

在我的项目中,我有一个名为 Command 的基类/接口。事实上,Command 类只包含一个字段 id(唯一)。

public interface Command {
   public int getId();
   public void execute();
}

因此,Command 的每个子类都有一个唯一的 id 和一个名为 execute 的方法,该方法由子类实现。

存在许多子类,如 MoveCommand、ResizeCommand 等,它们没有公共数据字段(id 除外)。

例如:

public class MoveCommand implements Command {
   private int id;
   private int oldX;
   private int oldY;
   private int newX;
   private int newY;
   public void execute() { ... }
   public int getId(){return id; }
}

public class ResizeCommand implements Command {
   private int id;
   private int oldWidth;
   private int oldHeight;
   private int newWidth;
   private int newHeight;
   public int getId(){return id; }
   public void execute() { ... }
}

然后我有另一个名为 Document 的类,其中包含命令列表

public class Document {
  private List<Command> commands;
}

所以很多基类“select from Command”的查询都是在运行时执行的。

我的问题是: 在这种情况下我应该使用什么样的继承策略才能获得最佳性能。

在 SQL 中:在这种情况下,JOIN(每个子类的表)或 UNION(每个具体类的表)性能更好吗?

有人有这方面的经验吗?

我猜每个子类的表会是更好的(设计)解决方案,但我不确定,因为存在一个具有单列(id)的数据库表,因为这是命令中唯一的东西常见的。

【问题讨论】:

    标签: java hibernate table-per-class


    【解决方案1】:

    我希望联合策略更快,因为它需要更少的连接,但这实际上取决于您的应用程序做什么。由于基表不包含除 ID 之外的任何其他列,因此无论如何它都不是真正有用的。

    两种方法之间的差异主要与归一化有关。 join 策略允许为层次结构中的任何类(甚至基类)定义外键,而 union 策略只允许具体类的外键。这可能是文档和命令之间的连接表的问题。 union 策略还意味着公共列的重复,但在您的情况下没有任何列,所以这不是一个真正的问题。

    【讨论】:

    • 那么在这种情况下,UNION 比 JOIN 快吗?我认为 UNION 的数量与 JOIN 的数量相同
    • 我希望它会更快。例如,获取特定的 MoveCommand 只需要从一个表中选择,而不需要连接到基表。但正如我所说,您只有通过同时实施和测量才能知道这一点。我不知道您申请的任何方面,因此无法给出明确的答案。
    猜你喜欢
    • 2011-12-31
    • 2015-11-11
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2017-03-12
    • 2011-09-06
    相关资源
    最近更新 更多