0

非常にシンプルなデータベースを作りたいです。でも編集履歴が知りたい!

明らかに、次のようなものがあります。

Product

title | price | created_at | updated_at

私の意見では、「edition」列をテーブルに追加します。エディションのデフォルトは1です。

Railsを使用してprice列を編集すると、新しいレコードが作成され、「エディション」が増加します。

例:

Product

TITLE | PRICE | CREATED_AT | UPDATED_AT | EDITION
Plane | 12    | 9-19       | NULL       | 1

編集すると、次のようにレコードが作成されます。

Product

TITLE | PRICE | CREATED_AT | UPDATED_AT | EDITION
Plane | 8     | 9-20       | NULL       | 2

しかし、新版の「飛行機」製品を知りたいときに、データを選択する方法がわかりません。編集履歴を検索すると、次のようなコードを使用できます

scope :history, lambda { |tit| where(:title => tit) } //same title

これは最高のデザインではないと思います。

そして、他に何か考えを提案しますか?

4

4 に答える 4

1

あなたはすでにデータベース設計について良い答えを持っています、私はちょうど私の5セントを追加して、車輪の再発明をしないであなた自身に共通の要件を実装するようにアドバイスしたいです、あなたのためにそれをする宝石の1つを見てください、個人的に私はお勧めしますPaperTrail: https ://github.com/airblade/paper_trail

于 2012-09-20T11:39:41.443 に答える
0

簡単な変更:

productテーブルに新しいレコードを作成する代わりに、「field」、「from」、「to」の列を持つProductChangesというテーブルを維持することができます。価格が12から8に更新されると、値(product_id = "" field = "price"、from = 12、to = 8)を使用してレコードを作成できます。

于 2012-09-20T02:58:40.397 に答える
0

最も簡単な編集マップは、実際には古いデータを別のテーブルに保存することです。

Product_History
-- Note: We have added a surrogate primary key
-- This makes it possible to have duplicate product titles
-- which we may wish to support later.
-- It's just an auto-incrementing integer column. 
Product_ID | Title | Price | Created_At | Updated_At | Updated_By

次に、Productテーブルを更新するたびに、Product_Historyテーブルに古い値をダンプするだけです。

もう少し柔軟な方法は、データをさらに非正規化された状態で保存することです。

Edit_History

Table_Name | Entity_ID | Previous_Value | Current_Value | Edit_Date | Edited_By

この2番目のバリアントは、複数のテーブルへの変更を記録するために使用できます。(これは、複合主キーがないことを前提としていることに注意してください)。

どちらの場合も、最新の値を知りたいときはいつでもProductテーブルをクエリし、必要なときはProductテーブルの主キー(Edit_Historyバリアントの「Product」テーブル名と組み合わせて)を使用してHistoryテーブルをクエリします。このエンティティが受けた変更の履歴を知っています。

于 2012-09-20T02:59:21.173 に答える
0

私の個人的な意見は、changes列を使用して別のテーブル(と呼びます)を作成することです

id(PK)、prod_id(FK)、title、price、updated_at

メインテーブルを更新するたびに、メインテーブルの現在の値をテーブルにコピーしchangesます。前者は変更される可能性がなく、この変更テーブルで簡単なクエリを使用して後者を簡単に見つけることができるため、 created_atand列は必要ありません。edition

于 2012-09-20T03:06:48.267 に答える