0

Grails/Gorm では、定義された位置にオブジェクトを保持する物理サイト保存しています。

ドメイン クラスは単純に次のようになります。

例 A

サイト DC

  • サイト名
  • positionmap (1: 犬, 2: 猫, 3:foo, 4:bar, ... 平均 30 アイテムまで)

...しかし、オブジェクトはその位置を変更するため、特定の時間 (いつ) にどの位置が何によって占有されていたかを後で確認できるようにする必要があります。

したがって、別のドメインクラスを追加しました

例 B

ポジション DC

  • から有効
  • 有効な
  • 位置マップ (1: 犬、2: 猫、3: フー、4: バー)
  • 所属SITEへ

サイト DC

  • サイト名

すべてのオブジェクトには説明があり、同じオブジェクトを使用するサイトが多数あるため、すべてのオブジェクトを保持するドメイン クラスを追加しました。結果:

例 C

オブジェクト DC

  • 名前
  • 説明

ポジション DC

  • から有効
  • 有効な
  • 位置マップ (1: reference_to_dog、2: reference_to_cat、3:reference_to_foo、4:reference_to_bar)
  • 所属SITEへ

サイト DC

  • サイト名

今、私には、マップはもはや合理的ではないように思えます。

マップを削除して、さらに別のドメイン クラスに置き換えることを考えています。

例 D

オブジェクト DC

  • 名前
  • 説明

オブジェクトから位置へのDC

  • 位置番号 (1、2、3、4、...)
  • オブジェクト (reference_to_cat、reference_to_dog、reference_to_foo、...)
  • 所属するPOSITIONSへ

ポジション DC

  • から有効
  • 有効な
  • 所属SITEへ

サイト DC

  • サイト名

質問

  1. マップをデータベースに入れることは、一般的に良い考えですか、それとも悪い考えですか?
  2. どうすればこれをより簡単に達成できますか?
  3. それを行うための最もパフォーマンスの高い方法は何ですか?

編集:ROBS ANSWERに基づく新しいアプローチ

Rob さんの提案に触発されて、「SeasonPlan」(「ResidenceHistory」を修正) に「最前列」の役割を付与するこのデータ モデルを起草しました。

class Zoo {
    static hasMany = [seasons: SeasonPlan]
    String name
}

// one way of representing histories
class SeasonPlan = {
    static belongsTo = [zoo: Zoo] // a SeasonPlan belongs to a single particular Zoo
    static hasMany = [cages: Cage]
    DateTime from
    DateTime until
}

class Cage {
    static belongsTo = [seasonPlan: SeasonPlan] // a cage belongs to a single seasonplan
    Species species // a cage has a single Species
    Integer cageNumber
}

class Species {
    // static hasMany = [cages: Cage] // commented out - no reverse-lookup necessary
    String name
}

これには欠点が 1 つあります。シーズンごとに新しいケージがありますが、実際にはケージは同じままです。(これが望ましくない理由をより明確にするために、「ケージ」内の「Integer squareMeters」を想像してください。)

私にとって、そのようなことをデータモデルに適用することはしばしば理解するのが難しいです.現実世界の相関関係を維持しながら、このような「疑似静的」データをアプリケーションにどのように適合させるのですか?

私の言いたいことが理解できることを願っています-そうでない場合は申し訳ありません。

4

1 に答える 1

4

私はまだあなたのドメインを理解しようとしています。物事を少し複雑にしすぎているかもしれません。この基本モデルは機能しますか? そうでない場合は、その理由を説明できますか? あなたの条件をよりよく理解できるようになったら、私の例を更新します。

編集 - 以下のコメントを考慮して更新された例。

class Cage {
    static belongsTo = [zoo: Zoo] // a cage belongs to a single particular Zoo
    Species species // a cage has a single Species
    String name
}

class Zoo {
    static hasMany = [cages: Cage]
    String name
}

class Species {
    static hasMany = [cages: Cage] // a species can be in many different cages
    String name
}

// one way of representing histories
class ResidenceHistory = {
    Species species
    Cage cage
    DateTime from
    DateTime until
}

ドメインの使用方法は次のとおりです。

def sanDiego = new Zoo(name: 'San Diego Zoo').save()
def aviary = new Cage(name: 'Aviary', zoo: sanDiego).save()
def elephantCage = new Cage(name: 'Elephant Area, Cage 5', zoo: sanDiego).save()

def bird = new Species(name: 'Blue-Footed Booby', cage: aviary).save()
def elephant = new Species(name: 'Asian Elephant', cage: elephantCage).save()

new ResidenceHistory(species: bird, cage: aviary, from: new DateTime(), to: new DateTime().plusDays(20)).save()

リストされた質問に具体的に答えるには:

  1. それは場合によって異なります - 通常、データベースにマップを保存するよりも、データベースのリレーショナル機能を使用したいと思います。シリアル化された Java オブジェクトでない場合、生データを扱うのははるかに簡単です。
  2. 上記の私の例を参照してください。
  3. パフォーマンスが問題にならない限り、これは問題になりません。最も理に適っており、保守が最も簡単なソリューションを使用してください。それがパフォーマンスの問題を引き起こしていることがわかった場合は、アプリケーションをプロファイリングして問題を個別に修正してください。
于 2011-01-10T13:22:49.130 に答える