我正在为我当前的项目(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)的数据库表,因为这是命令中唯一的命令共同。
答案 0 :(得分:1)
我希望联合策略更快,因为它需要更少的连接,但它实际上取决于你的应用程序的功能。由于基表不包含除ID以外的任何其他列,因此它无论如何都不是很有用。
两种方法之间的差异主要与归一化有关。连接策略允许为层次结构中的任何类(甚至是基类)定义外键,而联合策略仅允许外键访问具体类。这可能是文档和命令之间的连接表的问题。联合策略也意味着重复使用公共列,但是在你的情况下你没有任何重复,所以这不是一个真正的问题。