1

私はORM(SQLAlchemyですが、私の質問は実装に依存しません)を使用して、親クラスとその子の間の多対多の関係をモデル化しています。概念を表現する簡単な方法は何でしょうか。 「子の1つがデフォルト/メインの子です」?

たとえば、次のことを永続化する必要があります。
このPersonインスタンスにはアドレスXとYがあり、メインのインスタンスはYです。

これは、「Person」、「Address」、「main」フラグを含む「PersonAddressRelation」のような「middle」クラスを使用して実装されているのを見ましたが、少し面倒に見えると思います。もっと良い方法はありますか?

4

2 に答える 2

2

最も簡単な方法は、結合テーブル PersonAddressRelation と、Address テーブルのキーとなる Person テーブルの DefaultAddress 列を作成することです。

于 2009-01-12T13:53:00.607 に答える
1

いくつかの発言。

  • 親も子も存在しないため、M:N の関係では「親」と「子」を指定しません。3 番目のエンティティ (中間エンティティ) を介して m:n の関係を持つ 2 つのエンティティがあります。

  • 「住所」は一般に有効なエンティティ タイプではありません。これは、「名前」にアイデンティティ (名、姓) がないのと同様に、意味的にアイデンティティがないためです。これは、タイプ Address のエンティティ インスタンスを再利用する場合に見られます。一般的にはそうしません。(ただし、顧客が複数の注文を持っている場合など、Customer エンティティ インスタンスを再利用します)

  • M:N 関係 (デフォルト) に属する属性を指定します。これは、関係自体がエンティティを形成することを意味します (これは中間エンティティであり、多くの場合、PK を形成する 2 つの FK フィールドしかありません)。これは、関係自体がエンティティーと見なされるため、「オブジェクト化された関係」と呼ばれます。この他の例としては、従業員 m:n 部門があり、従業員が勤務する部門で従業員が開始した StartDate を指定します。

したがって、一般的には、中間エンティティが存在する必要があるため、中間エンティティを作成し、そこに属性を追加します。Address を使用したこの特定のケースでは、関連するエンティティ (Person) 間で Address インスタンスを再利用していることを確認してください。そうでない場合は、Address を Person とマージします。または、1 人の人物が複数の住所を持つことができる場合は、Person - Address の間に単純な 1:n の関係を作成して正規化します。ただし、住所データを関連するエンティティにマージすることを恐れないでください。多くの場合、住所データは実際には再利用されません (したがって、m:n 関係は実際には存在しません。複数の person インスタンスに関連する Address インスタンスはありません。

于 2009-01-12T14:03:23.207 に答える