2011-11-03 2 views
0

날짜가있는 항목이있는 테이블이 필요합니다. 나는 일반적으로 그것을 어떻게 가있는 테이블을 가지고 있었다 : someId [고유하지 않습니다] startDate를 endDate가시작과 끝 날짜를 기반으로 한 GORM 복합 키

이 세 가지 기본 키를 만들 것 + 나는 확실히 날짜가 겹치지 않도록하기 위해 몇 가지 제약 조건을 추가 등

데이터베이스의 관점에서 볼 때 모든 것이 훌륭하지만, Grails에서 도메인 클래스를 작성하여 처리하려고 할 때 ... 잘 생각하면 어렵다고 생각합니다.

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

및 objectA에 이름 A를 objectB를 할당 : 를 ClassA hasOne의 ClassB가 내가 ClassB가에 항목이 [ClassB가이 날짜가 원거리 것] ​​: 방법은 내가 관계가있는 경우 있는지 확인 있나요 2011-11-03에서 objectA를 검색하면 2011-11-07에 objectB가 B라는 이름으로 나타납니다.

답변

0

우리는 결국 한 무엇 : [1.3.7가 고장 및 제약 처리가 미친 Grails의에 인덱스를 생성하기 때문에, 데이터베이스에] 는 세 개의 열 인덱스 및 제약 조건을 만들 정적 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를 찾은 다음 Bar를 찾아야 할 것이다. 내 경험에 따르면 복합 키는 여러 테이블 (또는 두 테이블 결합)을 여러 개 선택하는 것보다 항상 빠릅니다. – Krystian