0

在 Grails/Gorm 中,我存储了一个物理站点,该站点将对象保存定义的位置

域类只是:

示例 A

站点数据中心

  • 网站名称
  • 位置图(1:狗,2:猫,3:foo,4:bar,...最多平均 30 个项目)

...但是对象改变了它们的位置,我以后需要能够看到在给定时间(WHEN)占据了哪些位置。

因此我添加了另一个域类

示例 B

职位 DC

  • 有效自
  • 有效
  • 位置图(1:狗,2:猫,3:foo,4:bar)
  • 属于SITE

站点数据中心

  • 网站名称

由于所有对象都会有描述,并且会有大量使用相同对象的站点,因此我添加了一个域类来保存每个对象。结果:

示例 C

对象直流

  • 姓名
  • 描述

职位 DC

  • 有效自
  • 有效
  • 位置图(1:reference_to_dog,2:reference_to_cat,3:reference_to_foo,4:reference_to_bar)
  • 属于SITE

站点数据中心

  • 网站名称

现在,对我来说,地图似乎不再合理。

我正在考虑删除地图,用另一个域类替换它:

示例 D

对象直流

  • 姓名
  • 描述

对象到位置 DC

  • 位置编号 (1, 2, 3, 4, ...)
  • 对象(reference_to_cat,reference_to_dog,reference_to_foo,...)
  • 属于POSITIONS

职位 DC

  • 有效自
  • 有效
  • 属于SITE

站点数据中心

  • 网站名称

问题

  1. 将地图放入数据库通常是好还是坏?
  2. 这怎么能更容易实现?
  3. 最高效的方法是什么?

编辑:基于 ROBS 答案的新方法

受您的建议 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
}

这有一个缺点:每个赛季计划都有一个新的笼子 - 尽管实际上笼子保持不变!(想象一下“笼子”中有一个“整数平方米”,以更清楚地说明为什么不希望这样做。)

对我来说,将这样的东西应用于数据模型通常很难理解——我如何将这样的“伪静态”数据放入应用程序中,同时保持真实世界的相关性?

我希望我的意思是可以理解的——如果不是,对不起。

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 回答