2011-11-03 135 views
0

我想要一个表格,我想要有日期范围的条目。 我通常如何做的,是有一个表: someId [不是唯一] 的startDate 结束日期基于开始日期和结束日期的GORM复合键

这三个将创建一个主键+我想补充一些限制,以确保日期不重叠等

从数据库的角度来看,一切都很好,但是当我想在Grails中创建一个领域类来处理它时......那么我认为它更困难。 有没有一种方法,以确保如果我有一个关系: ClassA的hasOne ClassB的[ClassB的会日期范围] ,我有条目ClassB的:

Id StartDate EndDate  Name 
1 2011-11-01 2011-11-05 A 
1 2011-11-06 2011-11-10 B 

,并与名称的,以对象A分配对象B在2011年11月3日,然后在2011年11月7日检索objectA它会指向名为B的objectB?

回答

0

我们所做的到底是: 创建三列的索引和约束[数据库上,因为在Grails的创建索引1.3.7被打破,约束处理是疯狂],建立静态startDateendDate变量,保存当前范围的开始和结束日期。通过这种方式,我们能够保持我们想要的功能,并且性能非常好。

0

这似乎是一个糟糕的方式来设计您的数据库。在大多数情况下,你应该只使用一个数字ID作为对象。

如果您正在处理的情况是,您有多个与同一个对象关联的日期范围,那么您应该构建数据来表示该对象,通过拥有一个父对象和一个代表日期范围列表的子对象。

class Foo { 
    static hasMany = [bars:Bar] 
    static mapping = { 
     bars lazy:false 
    } 
    ... 
} 

class Bar { 
    static belongsTo = [foo:Foo] 
    Date startDate 
    Date endDate 
    ... 
} 

Grails使级联删除变得非常简单,所以没有真正的理由不以这种方式创建它。

+0

感谢您的回答,但这不是一个解决方案。每次我想访问数据时,我仍然需要进行搜索。我不能使用一个简单的findBy ...因为之间不会在我的情况下工作,我必须做一个条件搜索查询,或者我必须先找到Foo,然后寻找酒吧。根据我的经验,组合键总是比多个表上的多重选择[或连接两个表]更快。 – Krystian

相关问题