2012-09-14 5 views
0

난 그냥 고객의 입찰 제안 가격을 책정하는 새로운 데이터베이스 프로젝트를 시작했습니다.Grails의 데이터베이스 테이블 버전 제어

이제 새 입찰가는 데이터베이스의 최신 정보를 사용해야하지만 입찰가 작성자가 별도로 결정하지 않는 한 기존 입찰가를 시작할 때 사용한 데이터를 계속 사용해야합니다.

입찰가가 어떤 버전에서도 가격을 사용하기 때문에 다소 단순 해 지므로 제품이 해안가에 있으며 가격 책정 표의 이전 버전에서 사용 가능해도 더 새로운 프로젝트에서는 사용할 수 없습니다.

이 작업을 수행하려면 버전 열과 아마도 링크 된 버전 제어 테이블을 포함 시키려고합니다. 나는 이것이 충분할 것이라고 생각한다.

그러나 공통 데이터베이스 디자인 요구 사항을 충족해야하므로 필자는 기존의 "우수 사례"와이를 구현하는 기술이 있어야하므로 휠씬 재 설계보다는 기존의 경험을 기반으로 구축 할 것이라고 생각합니다.

이 문제를 해결하는 방법에 대한 조언이 있으십니까? 또한 나는 Grails 플랫폼에 대해 작업 중이기 때문에 Grails의 특정 정보가 크게 감사 할 것입니다.

class Bid { // Each new customer bid is stored in this table 
    String bidName 
    static hasMany = [ item: ItemList ] 
    static belongsTo = [ versionNumber: VersionControl] 
} 

class ItemList { // Products/Services are associated with a bid via this table 

    String description 
    static belongsTo = [ bid: Bid, item: Price ] 
} 

class Price { // The price of individual products and services the company offers 
    String description 
    Long value 

    static belongsTo = [ versionNumber: VersionControl] 
} 

class VersionControl { 
/** So that when filling in the ItemList form for a bid, I can query for only 
* prices with the correct version number 
*/ 

    String user 
    Long versionNumber 
    Date timestamp 

    static hasMany = [ bid: Bid, productOrService: Price ] 
} 

이 예는 잘 작동하고, 내가하고 싶은 것을 보여

나는 내가 지금 여기에 제대로 내 문제를 설명하는 예입니다 확실하지 않다. 나는 그것이 문제를 해결하는 가장 좋은 방법인지 그리고 그것이 얼마나 잘 확장되는지를 잘 모른다. 나는 추적 할 필요가있는 다른 매개 변수를 가진 약 20 개의 테이블을 가지고있다.

입찰가에는 항상 가격 책정 목록의 최신 버전이 지정되지만 사용자는 다른 버전을 선택할 수 있어야합니다.

아마도 회계 부서에서 제공 한 csv 파일을 사용하여 가격이 개별적으로 변경되지 않고 대량으로 업데이트됩니다. 각각의 csv는 데이터베이스와 관련된 새로운 가격 목록 버전을 대표하지만 내부 관리 관점에서 나타납니다.

비슷한 철학이 회사의 운영되는 환율이나 지리적 지역과 같은 DB의 다른 테이블에 영향을 미칩니다.

새로운 버전이 출시되는 규칙은 예측하기가 어려워서 endDate에 문제가 있는지 판단 할 수 있습니다.

답변

2

이 목표에 대한 특별한 Grails 지원은 없으며, 이것은 4th normal form입니다. 당신의 Price 명확하게 엄격과 Effectivity 동안, 내가 ou는 별도의 법인으로 Version를 추출하지한다고 생각

class Price { 

    static hasMany = [ values: PriceValue ] 

} 

class PriceValue { 

    Number amount 
    Date validFrom 
    Date validTo 

    static belongsTo = [ price: Price ] 

} 
0

: 귀하의 경우는 가격 엔터티에 대한 헤더 테이블과 한계 시간 값에 대한 서브 테이블이 될 것입니다 주어진 시간 간격 (나는 생각한다).

class Product { 
    // whatever 
} 

class ProductPrice { 
    String description 
    BigDecimal value 
    DateTime startDate // or use JodaTime Interval 
    DateTime endDate 

    static belongsTo = Product 
} 

class Bid { // Each new customer bid is stored in this table 
    String bidName 
    DateTime bidDate // or use createdDate 

    static hasMany = [products: Product] 
    static belongsTo = [ Customer ] 

    BigDecimal getProductPrice(Product p) { 
    ProductPrice.where{ 
     product = p && startDate >= bidDate && endDate < bidDate 
    }.find() 
    } 

    // or even 

    static transients = [ 'prices' ] 

    List<ProductPrice> getPrices() { 
    products.colect{ getProductPrice(it) } 
    // or even... 
    ProductPrice.where{ 
     product = p && 
     startDate >= bidDate && 
     endDate < bidDate 
    }.list() 
    } 

} 
+0

감사합니다. 그러나 우리의 경우 시간 간격은 너무 엄격합니다. 질문에 대한 설명을 추가했습니다. – Chopo87

0

내가 오라클 데이터베이스와 그들의 "작업 관리자"기능 (내가 Grails를 함께 사용하고 꽤 좋은 작동) http://www.oracle.com/technetwork/database/enterprise-edition/index-087067.html

이를 사용하는 것이 좋습니다 것입니다 :

그래서 나는 다음과 같은 디자인을 제안한다 당신이 나열한 모든 요구 사항을 해결할 것입니다 : 당신이 "버전을 사용 가능하게하는"경우 당신이 분기하는 부모로부터의 데이터의 현재 스냅 샷의 작업 공간을 생성하는 기능을 제공하는 테이블. 이러한 모든 작업 공간은 서로 독립적으로 변경하고 준비가되면 주 작업 공간으로 다시 병합 할 수 있습니다 (오라클은 이들 간의 충돌 해결을 단순화합니다). 그러나 가격 테이블과 같이 모든 테이블을 버전 관리해야하는 것은 아니므로 테이블을 정기적으로 관리해야합니다.

다른 많은 유용한 기능이 있지만 기본 기능이 청구서에 부합하는 것처럼 들립니다. 특수하게해야 할 일은 응용 프로그램 사용자가 UI에서 충돌을 체크 아웃, 병합 및 해결할 때 작업 영역과 상태를 추적하는 것입니다.

+0

고마워요, 제가 조사 할게요. 이것은 내가 찾는 것과 같게 들린다. – Chopo87