如何处理数据类型类?

时间:2015-09-16 13:55:44

标签: database oop orm modeling class-design

我已阅读有关数据类型的this question。我如何处理这些事情以及数据库?我所知道/理解的:与普通类相比,如果数据类类具有相同的属性值,则应认为它们是相等的。

示例:

// Using Java here just as pseudo code. Personally, I don't use Java.

class Car {
    public Color color;
}

// But here I'm not sure. Is this better?
class Color {
    static String RED = 'red';
    static String BLACK = 'black';
    public String value; // gets a value from class constants
}

// Or this?
class Color {
    static int RED = 1;
    static int BLACK = 2;
    public int value; // gets a value from class constants
}

而且我也不知道我是否需要db中的两个表(汽车,颜色)或只需一个。颜色应该是硬编码的,而不是存储在db?

抱歉,如果我无法清楚地描述我的问题。我希望任何人都能提供一个例子。但我想如果我只是在表中添加一个Varchar列,以便每个记录都有一个字符串'red'或'black'(或其他颜色),每个人都会建议我使用另一个表格来表示颜色并建立一个关系表格。没关系。但是再次在代码中,如果我想获得颜色,我总是需要引用值属性 - 例如如果我想在UI中显示颜色(字符串),我总是需要做carObj.color.value,而不仅仅是更加直观的carObj.color,IMO。 ......有些事我不理解。

任何人都可以在何时以及如何使用数据类型类/对象时显示示例?

2 个答案:

答案 0 :(得分:1)

嗯,他们说的是正确的,你应该在两个表中代表你的类型。 一个用于Car的表和一个用于与ID相关的颜色的表。

//rapresent a row of your table Car, an Entity
public class CarDTO { 
    private int idCar;
    private String type;
    private int idColor;

    public ...// getters and setters here

    //For your first question, about if types are equals, you need to implement the method
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof CarDTO )) {
            return false;
        }

        CarDTO carToCompare = (CarDTO ) obj;

        return (this.getIdCar() == carToCompare.getIdCar()
        && this.getType().equals(carToCompare.getType())
        && this.getIdColor() == carToCompare.getIdColor());
}

//rapresent a row of your table Color, an Entity
public class ColorDTO { 
    private int idColor;
    private String color;

    public ...// getters and setters here

    //For your first question, about if types are equals, you need to implement the method
    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof ColorDTO )) {
            return false;
        }

        ColorDTO colorToCompare = (ColorDTO ) obj;

        return (this.getIdColor() == colorToCompare.getIdColor()
        && this.getColor().equals(colorToCompare.getColor()));

}

您有两个表示表格行的实体,而Car的idColor与颜色的idColor相关。 这些当然是您的代码目前不相关的类型,但您可以创建一个实体,它是您需要的信息的连接。例如查询:

SELECT c.idCar, c.type, co.colour FROM Car c, Colour co WHERE c.idColor = co.idColor

将成为您的行的表示的实体,连接查询的结果是:

public class CarAndColorDTO { 
    private int idCar;
    private String type;
    private String color;

    public ...// getters and setters here

    //...Equals here
}

您应该避免代码中的颜色硬编码,因为您需要在数据库中使用这些信息。 当然这是一个简单的解释,如果您使用Java,您应该看到JPA实体以获得更好的解释和易用性(Join,Foreign Keys,ecc ...)

还要注意代码中变量的封装:)

我希望这可以帮到你

答案 1 :(得分:0)

为什么不为Color使用枚举类型?

请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html