2

これは「ベスト プラクティスは何か」という質問です。

注文、顧客、住所の 3 つのテーブルがあります。

Order
------
ID
ADDRESS_ID


Customer
------
ID


Address
------
ID
CUSTOMER_ID
IS_HIDDEN

ユーザーは複数のアドレスを持つことができ、いつでも自由に編集できます。ユーザーが注文すると、その時点での住所の「スナップショット」を保存し、それを注文に関連付けて、ユーザーが利用できないようにする必要があります。つまり、Customer ではなく Order テーブルが所有する住所行を複製したいと考えています。この所有権は何らかの方法で示す必要があります (たとえば、IS_HIDDEN フラグを使用)。

アドレス テーブルの一部のデータが Customer テーブルによって "所有" されることもあれば、"Order" によって所有されることもあるというこの正しいアプローチはありますか?

もう 1 つの解決策は、Address テーブルのすべての列を順番に複製することです。そのため、所有権は明示されますが、スキーマの重複については気分が悪くなります。

4

2 に答える 2

3

アドレスのスナップショットが本当に必要な場合は、別のテーブルではなく、おそらくorderにアドレスを保存する必要があります。

クエリとデータを不必要に複雑にすることになります。

そして、あなたが説明している実装では、とにかく重複が発生します。

例:

顧客住所 = 1番地

顧客が注文すると、住所はテーブルに隠されています。

顧客は、同じ住所で別の注文を出します。アドレスはテーブルに保存され、非表示になります。

最終結果は次のようになります。

Customer ID | Address  | Hidden  
    1       | 1 street |  false  
    1       | 1 street |  true  
    1       | 1 street |  true  
于 2013-01-08T16:08:16.000 に答える
1

リンク テーブル (連想テーブルと呼ばれることもあります) を使用して、アドレスをリンク先のものにリンクしてください。

「顧客」と「注文」はアドレスの一部ではなく、適切な正規化のためにそのテーブルに含めるべきではありません。

のようなものを試してください

customer_address
------------------
customer_id
address_id
begin_dt
end_dt
type <- indicate physical location, mailing address etc.

同様に

order_address
---------------
order_id
address_id
type <- ship to, bill to - or others.
于 2013-01-08T16:11:18.270 に答える