【问题标题】:How to reflect inheritance and polymorphism in the database?如何在数据库中体现继承和多态?
【发布时间】:2021-11-16 12:59:47
【问题描述】:

我是 Java 新手,正在学习继承和多态。 我有一个抽象的 Pet 类,并有从 Pet 父类扩展的子类 Dog 和 Bird。

public abstract class Pet {

    private String name;
    private int age;
    private String color;

    public Pet(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public void speak() {
    System.out.println("I am a speak method of main class");
    }

}



public class Dog extends Pet{

    private String numberOfTeeth;

    public Dog(String name, int age, String color, String numberOfTeeth) {
        super(name, age, color);
        this.numberOfTeeth = numberOfTeeth;
    }

    public String getNumberOfTeeth() {
        return numberOfTeeth;
    }

    public void setNumberOfTeeth(String numberOfTeeth) {
        this.numberOfTeeth = numberOfTeeth;
    }

    public void playFetch() {
        System.out.println("dog is playing fetch");
    }
}



public class Bird extends Pet{

    private int flapsPerSecond;

    public Bird(String name, int age, String color, int flapsPerSecond) {
        super(name, age, color);
        this.flapsPerSecond = flapsPerSecond;
    }

    public void fly() {
        System.out.println("the bird is flying");
    }
}

现在我正在尝试为宠物对象创建一个数据库。困境是我不确定是否应该为 Dog 和 Bird 类创建单独的表,或者应该只拥有一个 Pet 表。在前端,我正在尝试实现特定于宠物类型的功能。例如,如果对象类型是 Dog,则创建一个发出吠叫声的按钮。如果对象类型是鸟,则创建一个按钮,让鸟儿拍打翅膀发出声音。我正在考虑在宠物表上创建一个名为“物种”的列,并说明宠物是狗还是鸟。而当我们从数据库中提取数据时,如果我们看到 Species 字符串值为 Dog,则相应地创建相应的按钮。

【问题讨论】:

    标签: java sql database


    【解决方案1】:

    在数据库中存储多态类有多种策略。

    看看at the Hibernate-ORM docs section 2.11 Inheritence。这 5 个小节基本上是 5 种不同的策略。每个都在查询效率、数据大小等方面进行权衡。

    例如,你可以把 Bird and Dog and Pet:

    • 或在单个表中(宠物)。这意味着对于狗来说,Pet.flapsPerSecond 列是 null
    • 或在 3 个不同的表中(宠物、鸟、狗)。这意味着加载狗需要同时查询 Dog 和 Pet。
    • 或在 2 个表中(鸟、狗)。这意味着要查询所有宠物,您需要在运行查询后合并结果。
    • ...

    此处的示例只是权衡取舍的冰山一角。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 2014-04-30
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多