7

下の写真のようなショッピング カートがあります。1 つの致命的な欠陥を除いて、セットアップは正常に機能します。注文すると、注文は製品にリンクされているため、製品を購入した後に製品を更新した場合、購入したときの製品の外観(価格を含む)を希望することを示す方法はありません. これは、バージョン管理が必要であることを意味します。

現在のスキーマ

現在の私の計画は、新しい製品またはバリエーションが作成されるか、既存の製品が編集されたときに、データベースに製品またはバリエーションの複製を作成することです。購入時には、注文を製品ではなくバージョンにリンクします。

これはかなり単純に思えますが、バージョン管理の必要がないのはカテゴリだけであることがわかります (どのカテゴリにあったかは誰も気にしないため)。したがって、バージョンを設定する必要があります。

  • 製品
  • バリアント
  • 各バージョンの属性のキー -> 値のペア
  • 画像

私の現在の考えは、

注: 製品が作成されると、デフォルトのバリアントも作成されます。これは削除できません。

  • 商品を作るとき
    • 製品を製品テーブルに挿入します。
    • デフォルトのバリアントを作成する
    • 製品を products_versions テーブルに複製します
      • 現在の id 列を product_id 列に置き換えます
      • ID列を追加
    • バリアントを variants_versions テーブルに複製します
      • 現在の id 列を variant_id 列に置き換えます
      • ID列を追加
      • product_id 列を product_version_id 列に置き換えます

  • 商品編集時
    • 製品を製品テーブルに更新します。
    • 製品を products_versions テーブルに複製します
      • 現在の id 列を product_id 列に置き換えます
      • ID列を追加
    • すべての製品バリエーションを variants_versions テーブルに複製します
      • 現在の id 列を variant_id 列に置き換えます
      • ID列を追加
      • product_id 列を product_version_id 列に置き換えます
    • すべての variant_image_links を variant_Image_link_version テーブルに複製します
      • 現在の variant_id 列を variant_version_id 列に置き換えます

  • バリアントが追加されたとき
    • バリアントをバリアント テーブルに追加します。
    • 製品を products_versions テーブルに複製します
      • 現在の id 列を product_id 列に置き換えます
      • ID列を追加
    • すべての製品バリエーションを variants_versions テーブルに複製します
      • 現在の id 列を variant_id 列に置き換えます
      • ID列を追加
      • product_id 列を product_version_id 列に置き換えます

  • バリアントの編集時
    • バリアント テーブルのバリアントを更新します。
    • 製品を products_versions テーブルに複製します
      • 現在の id 列を product_id 列に置き換えます
      • ID列を追加
    • すべての製品バリエーションを variants_versions テーブルに複製します
      • 現在の id 列を variant_id 列に置き換えます
      • ID列を追加
      • product_id 列を product_version_id 列に置き換えます
    • すべての variant_image_links を variant_Image_link_version テーブルに複製します
      • 現在の variant_id 列を variant_version_id 列に置き換えます

したがって、最終的な構造はフルサイズのように見えます

これはすべて素晴らしいように思えますが、大量の重複データのように見えることを除けば、たとえば、製品を更新すると、挿入されてから更新されていないにもかかわらず、バリアントが複製されます。また、これは大変な作業のようです。

これを行うより良い方法はありますか?

4

2 に答える 2

5

ERP(および場合によっては給与)システムが行うことを行うことができます:開始および終了の日付/時刻を追加します。そう...

  • バリエーションと価格は、共通の日付に基づいて製品と一致します。
  • すべてのクエリはデフォルトで現在の日付で実行され、各テーブル間の結合では、重複/交差する日付範囲も考慮する必要があります。parent_start_date <= child_start_date AND parent_end_date >= child_end_date
  • 価格の変更やバリエーションごとに行が重複することになりますが、製品の価格が変更されたときに、多くのレコード (バリエーション ID など) を更新し続ける必要はありません。
  • 有効な日付が使用されていることを確認する必要があります。PS: 最新/最新のレコードの終了日時には、システムの最大日付を使用してください。

ところで、同じ行に沿ったいくつかの関連する質問:

于 2012-11-14T18:48:36.677 に答える
0

これに対する別のアプローチは、データを編集または削除せず、新しいデータを作成することだけです。SQL用語では、テーブルに対して実行する操作はINSERTとSELECTのみです。

目的を達成するには、各テーブルに次の列が必要です。

  • version_id-これが主キーになります
  • id-これは、オブジェクトのバージョンをまとめたものになります(たとえば、製品のすべてのバージョンを検索するには、SELECT * FROM products WHERE id =?)
  • 作成日
  • is_active-何も削除していないので、(論理的に)データを削除するためにフラグを立てる必要があります

これで、製品テーブルは次のようになります。

CREATE TABLE products (
  version_id CHAR(8) NOT NULL PRIMARY KEY,
  id INTEGER NOT NULL,
  creation_date TIMESTAMP NOT NULL DEFAULT NOW(),
  is_active BOOLEAN DEFAULT true,
  name VARCHAR(1024) NOT NULL,
  price INTEGER NOT NULL
);

CREATE TABLE variants (
  version_id CHAR(8) NOT NULL PRIMARY KEY,
  id INTEGER NOT NULL,
  creation_date TIMESTAMP NOT NULL DEFAULT NOW(),
  is_active BOOLEAN DEFAULT true,
  product_version_id CHAR(8) NOT NULL,
  price INTEGER NOT NULL,
  override_price INTEGER NOT NULL,
  FOREIGN KEY (product_version_id) REFERENCES products(version_id)
);

次に、いずれかのテーブルに挿入します

  1. 一意のversion_idを生成します(これにはいくつかの戦略があります。1つはデータベースシーケンスを使用するか、MySQLの場合はant AUTO_INCREMENTを使用します)。
  2. IDを生成します。このIDは、製品のすべてのバージョンで一貫しています。

テーブルの行を更新するには、グラフ全体を挿入する必要があります。たとえば、製品を更新するには、新しい製品と新しいバリアントを挿入する必要があります。(ここには最適化の余地がたくさんありますが、最適化されていないソリューションから始めるのが最も簡単です。)

たとえば、製品を更新するには

  1. 一意のversion_idを生成します
  2. 同じIDを使用する
  3. 新しい製品バリアントを挿入します。バリアントは、product_version_idが異なることを除いて、「更新中」の製品の以前のバージョンにリンクされているものと同じになります。

このプリンシパルは、すべてのテーブルに拡張できます。

製品の最新バージョンを見つけるには、creation_date列を使用して、最後に作成された製品を取得する必要があります。

このモデルはより多くのスペースを使用しますが、それが単純であることを考えると、これは公正なトレードオフになると思います。INSERTとSELECTのみがあり、データが変更されることはありません。

于 2012-11-16T04:38:07.627 に答える