7

我有枚举CarBrand

public enum CarBrand {
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL
}

和枚举CarBodyType

public enum CarBodyType {
    SEDAN, MINIVAN, VAN
}

他们之间的关系是多对多的。即一个汽车品牌可以有多个车身类型的变体,而一个车身类型有多个品牌。

如何用这些枚举在我的代码中定义这样的实体关系模型?

也许我需要将每个枚举中的字段作为另一个枚举参数化的集合?

public enum CarBrand {
    BMW, MERCEDES, VOLKSWAGEN, AUDI, FORD, OPEL;

    private Set<CarBodyType> bodyTypes;         

    public Set<CarBodyType> getBodyTypes() {
       return bodyTypes;
    }

    public void setBodyTypes(Set<CarBodyType> bodyTypes) {
       this.bodyTypes = bodyTypes;
    }
}

public enum CarBodyType {
    SEDAN, MINIVAN, VAN;

    private Set<CarBrand> brands;

    // getter and setter
}

这是一个好的解决方案吗?或者通过第三个联结实体来实现这种关系会更好吗?如果是这样,它应该是什么?这个实体应该如何设计,它应该包含哪些字段?

4

3 回答 3

4

几乎可以肯定,体型“拥有”品牌是不正确的。一个品牌“有一个”体型很可能是不正确的。您最可能想要建模的是每个品牌允许的身体类型的一组单独的交集。

那就是你最有可能想要一个Vehicle有体型和品牌的:

public class Vehicle 
{
    private CarBrand brand;
    private CarBodyType body;
    ...
}

并创建车辆,每个车辆都对一个组合进行建模。

回应评论

例如这个案子呢?如果 Book 和 Author 是枚举。

我认为这本书/作者的示例不适用于枚举(也许您对枚举的使用是问题的核心)。书籍和作者的数量不限;您不会使用封闭集枚举对书籍或作者进行建模。此外,确实每本书都有一个或多个作者,而每个作者都只是写过一本书或多本书的作者(否则他们只是一个渴望成为作家的人)。

在书籍和作者的关系建模中,您将有一个Book表、一个Author表和一个单独的关系表,其中和表BookAuthor的外键结合在一起。在对象术语中,将单词“table”更改为“object”,但在对象模型中,您可能会将“table”替换为每本书中的一组作者和/或每个作者的一组书籍。BookAuthorBookAuthor

于 2012-12-15T01:28:50.750 回答
0

像这样具有循环依赖关系并不是一个好习惯。

如果您需要保持这种关系,请将其保存在单独的类中,以避免循环。

于 2012-12-15T01:35:25.763 回答
0

那么你的CarBrand类似乎是一个比 Enum 更复杂的结构。它仍然可以是一个带有某种身份映射的值类型:

class CarBrand {

    static Set<CarBrand> AllBrands;  //replacement for CarBrand enum
    static Set<CarBodyType> GetTypes(CarBrand brand) { /* search this.AllBrands here */} 
    static Set<CarBrand> GetBrands(CarBodyType type) { /* search this.AllBrands here */} 

    /*specify types per brand */
    Set<CarBodyType> bodyTypes;
}

如果您更喜欢继续使用 CarBrand 枚举,这也可以作为显式的第三关系结构来完成。引入关联类:

class CarBrandTypePair {
    CarBrand, CarBodyType,
}

其余的应该作为CarBrand上面示例的静态部分。

第一种方式可能更具可扩展性:您将来会添加一些其他品牌的特定内容。使用第二种方法,您将添加越来越多的简单关联。

于 2012-12-15T16:57:11.817 回答