2

次の表があります。

Product (Id, CategoryId, Description, Value)

ある日、古い製品がすべて販売されなくなり、新しい製品が到着します。ただ、購入履歴は古いものを残しておきたい。古いものと新しいものを区別するために使用できるフィールドを追加して、このテーブルを作成することを考えました。

Product (Id, CategoryId, Description, Value, Available)

また

新しいテーブルを使用します。

ProductVersionTwo (Id, CategoryId, Description, Value)

同じ戦略が、テーブルProductCategoryおよび を使用している可能性のある他のすべてのテーブルに適用されますProduct

この変化が何回起こるかはわかりませんが、非常にまれであることは確かです。

どのようなソリューションをお勧めしますか?

4

2 に答える 2

1

少し変更して、最初のアプローチを使用します。後でこの情報が必要になるかどうかわからないので、available列をタイムスタンプ列validFromとに置き換えますvalidTo。それが現在入手可能な製品であればそうvalidToなるでしょう。NULLユーザーを混乱させないために、ビューを作成しますSELECT * /*except maybe validFrom and validTo*/ FROM Product WHERE validTo IS NULL;

2 番目のアプローチでは、最初のアプローチを適切にインデックス付けせず、実際には非常に多くの製品がある場合にパフォーマンスが向上することを除いて、利点はありません。代わりに、醜いクエリとUNION、製品バージョンを区別するためにその場で作成しなければならない追加の列を取得するだけです。さらに、さまざまなバージョン テーブルに関する情報をどこかに保存する必要があります。1 年後、バージョン 2 の何が特別だったのだろうと思うでしょう。そして 3 は?

2 番目のアプローチのもう 1 つの問題は、自動インクリメント列を使用している場合に他のテーブルに結合することです。古い製品などで分析を行っているときに混乱しないように、以前のバージョンの表の max(autoincrement) から始める必要があります。私の意見では悪い考えです。

于 2013-02-14T14:37:27.460 に答える
0

私があなたなら、最初の選択肢を選びます。そのほうが簡単で、将来この変更が発生したときに、古い製品に「使用不可」のフラグを立てるだけで済みます。

于 2013-02-14T14:53:37.620 に答える