0

顧客の入札提案の価格を設定するための新しいデータベース プロジェクトを開始しました。

データベース内の一部のテーブルには、価格テーブルなど、定期的に更新される情報が含まれています。

現在、新しい入札では常にデータベースの最新情報を使用する必要がありますが、既存の入札では、入札作成者が別の決定をしない限り、開始時に使用されたデータを使用し続ける必要があります。

入札はいかなる状況においてもバージョン間で価格を使用しないため、問題は多少単純化されているため、製品がコーストされ、価格表の古いバージョンで利用可能になったとしても、新しいプロジェクトでは利用できません.

これを実現するために、バージョン列と、おそらくリンクされたバージョン管理テーブルを含めることを計画しています。これで十分だと思います。

ただし、これは一般的なデータベース設計要件でなければならないと感じているため、既存の「ベスト プラクティス」とこれを達成するための手法が存在する必要があります。

この問題を解決する方法について何かアドバイスはありますか? また、私は 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 の決定が問題になる可能性があります。

4

3 に答える 3

2

この目標に対する Grails の特別なサポートはありません。これは単純に4th normal formです。あなたの場合、それは価格エンティティのヘッダーテーブルと制限付きの時間内の値のサブテーブルになります:

class Price {

    static hasMany = [ values: PriceValue ]

}

class PriceValue {

    Number amount
    Date validFrom
    Date validTo

    static belongsTo = [ price: Price ]

}
于 2012-09-14T12:03:01.077 に答える
0

Version別のエンティティに抽出するべきではないと思いますが、厳密に与えられた時間間隔を持つエフェクティビティPriceであることは明らかです(私は推測します)。

そこで、次のデザインを提案します。

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()
  }

}
于 2012-09-14T13:55:47.167 に答える
0

Oracleデータベースとその「ワークスペースマネージャー」機能を使用することをお勧めします(私はgrailsで使用していますが、かなりうまく機能します)http://www.oracle.com/technetwork/database/enterprise-edition/index-087067.html

これにより、リストしたすべての要件が解決されます。「バージョンを有効にする」場合、分岐元の親からデータの現在のスナップショットのワークスペースを作成する機能を提供するテーブル。これらのすべてのワークスペースは、互いに独立して変更を加えることができ、準備ができたらメインのワークスペースにマージできます (また、オラクルはワークスペース間の競合解決を簡素化します)。ただし、価格テーブルなど、すべてのテーブルをバージョン管理する必要はないため、定期的に管理されます。

他にも便利な機能がたくさんありますが、基本的な機能はあなたの法案に合うようです. 特別に行う必要があるのは、アプリケーション ユーザーが UI でチェックアウト、マージ、および競合を解決するときに、ワークスペースとその状態を追跡することだけです。

于 2012-09-14T14:14:08.430 に答える