域类中的Groovy Map与表关系 - 如何描述&坚持这个?

时间:2011-01-10 12:33:56

标签: java grails associative-array relation

在Grails / Gorm中,我存储物理站点,其中保留对象定义的位置

域类只是:

示例A

SITE DC

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

......但是物体会改变它们的位置,我需要稍后才能看到WHICH在给定时间(WHEN)被占用的位置。

因此我添加了另一个域类

实施例B

POSITIONS DC

  • validfrom
  • validto
  • positionmap(1:dog,2:cat,3:foo,4:bar)
  • belongsTo SITE

SITE DC

  • 网站名称

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

示例C

OBJECT DC

  • 名称
  • 描述

POSITIONS DC

  • validfrom
  • validto
  • positionmap(1:reference_to_dog,2:reference_to_cat,3:reference_to_foo,4:reference_to_bar)
  • belongsTo SITE

SITE DC

  • 网站名称

现在,对我而言,地图似乎不再合理。

我正在考虑删除地图,将其替换为另一个域类:

实施例D

OBJECT DC

  • 名称
  • 描述

对象到位置

  • positionnumber(1,2,3,4,...)
  • object(reference_to_cat,reference_to_dog,reference_to_foo,...)
  • belongsTo POSITIONS

POSITIONS DC

  • validfrom
  • validto
  • belongsTo SITE

SITE DC

  • 网站名称

问题

  1. 将地图放入数据库通常是一个好/坏主意吗?
  2. 如何更轻松地实现这一目标?
  3. 最有效的方法是什么?
  4. 编辑:基于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
    }
    

    这有一个缺点:每个赛季计划都有一个新的笼子 - 虽然实际上笼子保持不变! (想象一下“Cage”中的“Integer squareMeters”,以便更明显地说明为什么不需要这样做。)

    对于我来说,将这样的东西应用到数据模型通常很难理解 - 如何在保留真实世界的核心化的同时将这样的“伪静态”数据放入应用程序中?

    我希望我的意思是可以理解的 - 抱歉,如果没有。

1 个答案:

答案 0 :(得分: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. 除非性能成为问题,否则这无关紧要。使用最有意义并且最容易维护的解决方案,如果您发现它会导致性能问题,请分析您的应用程序并单独解决问题。