0

私のプロジェクトでは Grails を使用していますが、これは一般的な ORM に関する質問です。

私はORMとER図が初めてで、以下を最もよく説明/実装する方法を見つけようとしています:

ユーザー、接続の2つのエンティティがあります

接続は、2 人のユーザー (およびその他のプリミティブ属性) で構成されます。ユーザーは、複数の接続で見つけることができます。User と Connection の関係をどのように説明しますか? 私はあなたがそれを何と呼ぶか​​わかりません.2対多?ER図で描くとどうなりますか?

GORM では、双方向の関係にする必要がありますか?

編集

追加の要件として、ユーザーが関係において特定の役割を持っていると仮定します。生徒と教師のように。したがって、Connection には User タイプの生徒と教師のプロパティがあります。

4

2 に答える 2

1

問題はGORMではありません。あなたの問題はエンティティを扱っています。ドメイン クラスをコーディングする前に、保持して操作する情報を明確にイメージする必要があります。あなたの質問とコメントによると、RDBS を使用することを好みます。それでは、簡単でシンプルなテーブル (ORM、Grails、双方向は気にしないでください) をイメージして、このテーブルのモックの詳細を埋めてみてください。

ユーザー

  • ニックネーム (文字列)
  • otherUsersFields

繋がり

  • 教師 (ユーザー)
  • 学生(利用者)
  • otherConnectionFields

これで、すべてのユーザーとすべての接続がわかりました。与えられた接続に対して、誰が教師か - connection.teacher と生徒 - connection.student を言うことができます。

注:任意の接続には 2 人のユーザーしかいません。

ユーザーに注意してください。すべてのユーザーが生徒および教師になることができます。ユーザーが生徒または教師のみになることができる場合は、追加のフィールドを追加する必要があります。たとえば、

ユーザー

  • ニックネーム (文字列)
  • isTeacher (ブール値)
  • otherUsersFields

これで、ユーザーのリストができて、誰が st であるかがわかります。または技術。特定のユーザーのすべての接続を取得するにはどうすればよいですか? GORM が提供するもの: Connection.findAllByStudent( givenUser), Connection.findAllByTeacher( givenUser)

この表はあなたの情報を完全に示していますか?

于 2013-08-08T05:34:05.867 に答える
0

あなたが望むものは、接続コレクションに何らかの制約が適用された多対多の関係として説明できると思います。users単方向/双方向に関しては、ユースケースに応じてどちらかを達成できると思いますが、単方向はおそらくマッピング/構成が難しいでしょう.

私はこれをテストしていませんが、双方向の多対多は次のようになります

class Connection {
  ...
  Set users = [] //ensure users exists, constraints won't work on null 
  static belongsTo = [User] 
  static hasMany = [users: User]

  static constraints = {
    users maxSize: 2
  }
}

class User {
  ...
  static hasMany = [connections: Connection]
}

頭のてっぺんから単方向の例はありませんが、追加のマッピング クラスを使用する必要があるかもしれません。

繰り返しますが、これはテストしていませんが、マッピング クラスを使用した単方向の多対多の例を次に示します。

class Connection {
  ...
  Set users = []
  static hasMany = [users: ConnectionUser]
  static constraints = {
    users maxSize: 2
  }
}

class User {
  ...
}

class ConnectionUser {
  User user
  Connection connection
  //or for cascading effects
  //static belongsTo = [connection: Connection]
  ...
  ... //lots of additional code to manage adding,
  ... //removing, updating Connection-to-User relationships
} 

Connection はユーザーについて知っていますが、ユーザーは自分が属する Connection については知りません。マッピング クラス ルートに進む場合は、Connection と User の関係を手動で管理する必要があります。マッピング クラスの例については、Spring Security Core PersonAuthorityクラスをご覧ください。

于 2013-08-07T17:51:22.043 に答える