2012-09-14 28 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代表一個新的謹慎的價格表版本,不僅涉及數據庫而且涉及內部管理角度。

一個類似的理念會影響數據庫中的其他表格,例如公司使用的匯率或地理區域。

與新版本發佈的規律,也很難預測,這可能使確定結束日期的問題。

回答

2

沒有爲這個目標沒有什麼特別的Grails的支持,這是一個simly 4th normal form。你的情況,這將是價格的實體頭表和值在時間限制的子表:

class Price { 

    static hasMany = [ values: PriceValue ] 

} 

class PriceValue { 

    Number amount 
    Date validFrom 
    Date validTo 

    static belongsTo = [ price: Price ] 

} 
0

我相信歐不應該提取Version到一個單獨的實體,而你的Price顯然是一個Effectivity與嚴格給定的時間間隔(我假設)。

所以,我提出以下設計:

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

我會建議使用Oracle數據庫和他們的「工作區管理器」功能(我使用Grails使用它和它的作品相當不錯)http://www.oracle.com/technetwork/database/enterprise-edition/index-087067.html

這可以解決您列出的所有需求:如果您使用「版本啓用」表,您可以從您正在分支的父級創建當前數據快照工作區的工作空間。所有這些工作空間可以彼此獨立地進行更改,並在準備就緒時合併回主工作區(並且Oracle簡化了它們之間的衝突解決方案)。但是,並非所有表格都必須進行版本管理,例如定價表格,以便定期進行管理。

有很多其他有用的功能,但它聽起來像它的基本功能將適合您的賬單。唯一需要做的事情就是隨着應用程序用戶檢出,合併和解決用戶界面上的衝突,跟蹤工作區及其狀態。

+0

中添加了解釋謝謝,我會研究它。這聽起來像我在找什麼。 – Chopo87