2011-09-22 11 views
5

ここでは簡単な例を示します。データベースのテーブルに顧客のデフォルトの配送先住所を指定するにはどうすればよいですか?

住所表と1対多の関係にある顧客表があるとします(顧客は複数の配送先住所を持つことができますが、配送先住所は1人の顧客にしか属しません) )。

Customer Table 
------------- 
customer_id (PK) 


Address Table 
------------- 
address_id (PK) 
customer_id (FK) 

ここで、各顧客がデフォルトの配送先住所を指定できるようにします。

私は2つの方法が考えられますが、両方とも欠点があります。

オプション1

"IS_DEFAULT" と呼ばれるアドレステーブルにブール列を追加します。彼らはDBモデルを見れば、他の人が

短所

  1. アプリケーションを理解する

    賛否

    1. 選択クエリは簡単
    2. 簡単ですですfo 「1つの行のみがデフォルトになることができます」という制約を強制して維持するために使用されます。
    3. 既定のフィールドを更新するのは、アプリケーションが以前の既定のオプションを確認してリセットする必要があるためです。

    オプション2

    「ADDRESS_ID」と呼ばれるCustomerテーブルにカラムを追加し、外部キー(も何のアドレスが存在しないだけの場合にはNULLを許可)します。

    賛否

    1. 簡単にユーザーがそれを変更することを決定した場合、デフォルトのアドレスを更新します。
    2. データベースは、「1つの行のみがデフォルトになります」という制約を維持します。

    短所

    1. 私は、顧客の表に、私はデフォルトのメタデータのいくつかの種類を追加することを決定するたびに新しいインデックス付きの列を追加する必要があります。

    2. は私が一望できていますこのようなシナリオを処理するための標準的な方法がありますか、私の質問がある

    ハックのように思えますかもちろん、EAVのデフォルトオプションテーブルを作成するオプションはありますが、既存のコードベースに変更が加えられているため、できるだけシンプルに保つことをお勧めします。

答えて

1

(多分EAVデフォルトのオプションのテーブルを作成する?)

を私はこれを行うだろう、あなたは既存のコードを壊す心配している場合は特に。

Customer_Defaults 
------------------------------------ 
customer_id       PK, FK -> Customer 
default_shipping_address_id   FK -> Address 

これはきちんとしていませんか?全体を別のテーブルにプルすることによって、既存のテーブルだけを残します。ある種のORMレイヤーを使用している場合、この新しいテーブル上のオブジェクトを直接照会することができ、次にAddressオブジェクトまで歩くことができます。既存のCustomerオブジェクトまたはAddressオブジェクトに新しいオブジェクトを導入する必要はありません。

+0

は、私はそれについて考えたが、その後、私は、デフォルトすなわち、クレジットカードが –

+0

@BillHを占める必要とするすべてのテーブルに新しい「デフォルトテーブル」を作成する必要があると思います。なぜ? Credit_Cardテーブルを指す別のカラム 'default_credit_card_id'を追加することを妨げるものは何もありません。テーブルの名前は、顧客のすべてのデフォルトをキャプチャするのに十分一般的です。 – Mac

0

新しい要件を満たすときは、新しいテーブルについて考えてください。あなたの問題に近づく2つの方法があります。最初のものは2番目のものよりも厳格ではありません。 (私は2番目を使用します)。 "アドレステーブル"は "customer_addresses"という名前であると仮定します。

create table default_shipping_addresses (
    customer_id integer primary key references customers (customer_id), 
    shipping_addr_id integer not null unique references addresses (addr_id) 
); 

create table default_shipping_addresses (
    customer_id integer primary key references customers (customer_id), 
    shipping_addr_id integer not null unique references addresses (addr_id), 

    -- Add a UNIQUE constraint on customer_addresses (customer_id, address_id). 
    -- Since address_id is the primary key, it's unique, so (customer_id, 
    -- address_id) will also be unique. But you need the UNIQUE constraint to 
    -- allow a foreign key to reliably reference it, even in MySQL. 
    foreign key (customer_id, shipping_addr_id) 
    references customer_addresses (customer_id, address_id) 
); 
+0

私はcustomer_idとshipping_addr_idの間にそれぞれのソースを指す2つの外部キーを持つ複合主キーを作成できませんでしたか? –

関連する問題