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
}

これは良い解決策ですか?それとも、第 3 の接合エンティティを介してそのような関係を実装する方がよいでしょうか? もしそうなら、それは何であるべきですか?このエンティティをどのように設計し、どのフィールドを含める必要がありますか?

4

3 に答える 3

4

ボディタイプにブランドが「ある」というのは、ほぼ間違いありません。ブランドが体型を「持っている」というのは、おそらく真実ではありません。モデル化する可​​能性が最も高いのは、各ブランドの許容されるボディ タイプの交点の個別のセットです。

Vehicleこれは、ボディタイプとブランドを持つ が必要な可能性が最も高いです。

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

そして、それぞれが 1 つの組み合わせをモデル化するビークルを作成します。

コメントに応えて

たとえば、この場合はどうですか?Book と Author が列挙型の場合。

本/著者の例は列挙型では機能しないと思います(おそらく、列挙型の使用が問題の中心です)。本と著者の数は無制限です。閉集合列挙型を使用して本や著者をモデル化することはありません。さらに、すべての本には 1 人以上の著者がいるというのは事実ですが、すべての著者は 1 冊以上の本を書いたという文脈での著者にすぎません (そうでない場合、著者は単に著者になりたいと思っているだけです)。

書籍と著者のリレーショナル モデリングでは、Bookテーブル、テーブル、および とテーブルへの外部キーの結合であるAuthor別のリレーション テーブルがあります。オブジェクト用語では、「テーブル」という単語を「オブジェクト」に変更しますが、オブジェクト モデルでは、おそらく「テーブル」を各書籍の著者のセットおよび/または各著者の書籍のセットに置き換えます。BookAuthorBookAuthorBookAuthor

于 2012-12-15T01:28:50.750 に答える
0

このような循環依存関係を持つことはお勧めできません。

このような関係を維持する必要がある場合は、循環を避けるために別のクラスに保持してください。

于 2012-12-15T01:35:25.763 に答える
0

次に、CarBrandクラスは Enum よりも複雑な構造のようです。ただし、内部にある種の ID マップを持つ値型にすることもできます。

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 列挙型を使用したい場合は、明示的な第 3 の関係構造としても実行できます。関連クラスを導入します。

class CarBrandTypePair {
    CarBrand, CarBodyType,
}

CarBrand残りは上記のサンプルの静的部分としてある必要があります。

最初の方法はおそらくより拡張可能です。将来、他のブランド固有のものを追加します。2 番目のアプローチでは、より多くの単純な関連付けを追加します。

于 2012-12-15T16:57:11.817 に答える