gpt4 book ai didi

java - 域类中的 Groovy 映射与表关系 - 如何描述和持久化?

转载 作者:行者123 更新时间:2023-12-01 19:20:14 26 4
gpt4 key购买 nike

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

域类将简单地是:

示例 A

SITE DC

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

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

因此我添加了另一个域类

示例 B

DC 职位

  • 有效日期
  • 有效
  • 位置图(1:狗,2:猫,3:foo,4:酒吧)
  • 属于网站

SITE DC

  • 网站名称

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

示例 C

对象 DC

  • 姓名
  • 描述

DC 职位

  • 有效日期
  • 有效
  • 位置图(1:reference_to_dog、2:reference_to_cat、3:reference_to_foo、4:reference_to_bar)
  • 属于网站

SITE DC

  • 网站名称

现在,对我来说, map 似乎不再合理了。

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

示例 D

对象 DC

  • 姓名
  • 描述

对象到位置 DC

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

DC 职位

  • 有效日期
  • 有效
  • 属于网站

SITE DC

  • 网站名称

问题

  1. 将 map 放入数据库通常是好还是坏主意?
  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
}

这有一个缺点:每个赛季计划都有一个新的笼子 - 尽管实际上笼子保持不变! (想象一下“笼子”内有一个“整数平方米”,可以更明显地看出为什么不需要这样做。)

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

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

最佳答案

我仍在尝试了解您的域名;你可能把事情搞得太复杂了。这个基本模型可行吗?如果不是,你能解释一下为什么吗?如果我能更好地理解您的情况,我会更新我的示例。

编辑 - 根据以下评论更新示例。

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. 这取决于 - 通常我更喜欢使用数据库的关系功能而不是在数据库中存储 map 。如果原始数据不是序列化的 Java 对象,那么处理原始数据会容易得多。
  2. 请参阅上面的示例。
  3. 除非性能成为问题,否则这应该不重要。使用最有意义且最容易维护的解决方案,如果您发现它会导致性能问题,请分析您的应用程序并单独修复问题。

关于java - 域类中的 Groovy 映射与表关系 - 如何描述和持久化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com