is_current_products
およびテーブルにあるものはawaiting_approvals
、個別のテーブルではなく、列として格納する必要があります。
現在の製品は(顧客がサイトにアクセスするたびに)頻繁に照会されるため、最初にis_current_products
テーブルをフェッチしてから結果を表示するのは大きなオーバーヘッドになりますproducts
。テーブルを並べ替えるときは、さらに大きな頭痛の種になりproducts
ます。
これをどのように設計するかというproducts
とproduct_versions
、2つのテーブルがあります。ここで、products
は承認されたすべての情報をproduct_versions
表し、承認されているか履歴であるかに関係なくすべての情報を表します。
大まかなスキーマ:
products
-id
-current_version_id
-#all the product information from newest approved version#
product_versions
-id
-product_id
-approved_by (can be null)
-approved_on (can be null)
-#all the product information from this version#
現在の製品情報を表示するには、products
テーブルにアクセスするだけで十分です。
承認待ちのバージョンをフェッチするには、approved_byまたはapproved_on属性がnullであるすべてのProductVersionをフェッチするだけです。
バージョンを承認するために、authorized_byとapproved_onがproduct_versionで変更され、製品の情報がcurrent_version_idを含む現在のバージョンに変更されます。
この設計では、他のすべてのバージョンをそのままにして、古いバージョンに戻すこともできます。
お役に立てれば。