在Grails / Gorm中,我存储物理站点,其中保留对象在定义的位置。
域类只是:
SITE DC
......但是物体会改变它们的位置,我需要稍后才能看到WHICH在给定时间(WHEN)被占用的位置。
因此我添加了另一个域类
POSITIONS DC
SITE DC
由于所有对象都有描述,并且会有大量使用相同对象的SITE,我添加了一个域类来保存每个OBJECT。结果:
OBJECT DC
POSITIONS DC
SITE DC
现在,对我而言,地图似乎不再合理。
我正在考虑删除地图,将其替换为另一个域类:
OBJECT DC
对象到位置
POSITIONS DC
SITE DC
受你的建议启发,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”,以便更明显地说明为什么不需要这样做。)
对于我来说,将这样的东西应用到数据模型通常很难理解 - 如何在保留真实世界的核心化的同时将这样的“伪静态”数据放入应用程序中?
我希望我的意思是可以理解的 - 抱歉,如果没有。
答案 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()
具体回答您列出的问题: