Shipping address
、、を1つのテーブルShipping postcode
に入れる必要があります。Billing Address
Billing Postcode
Customer
それは3NFに違反しますか?
Shipping address
、、を1つのテーブルShipping postcode
に入れる必要があります。Billing Address
Billing Postcode
Customer
それは3NFに違反しますか?
それは3NFに違反しますか?
非常に厳密に言えば:はい。
実際には:いいえ。
計画していない場合:
...それからあなたのデザインに固執します。
アドレスを別のテーブルに正規化することは、名前と名前が繰り返される傾向があるという理由だけで、名前と姓を別々のテーブルに正規化するのとほぼ同じくらい賢明です。しないでください。
「実用的」と考える
SELECT
CustomerId
CustomerName,
COALESCE(BillingAddress, ShippingAddress) AS BillingAddress,
COALESCE(BillingPostcode, ShippingPostcode) AS BillingPostcode
FROM
Customer
対「完全に正規化」
SELECT
c.CustomerId
c.CustomerName,
COALESCE(bill.Address, ship.Address) AS BillingAddress,
COALESCE(bill.Postcode, ship.Postcode) AS BillingPostcode
FROM
Customer AS c
-- join customer-to-address-resolution for billing
LEFT JOIN CustomerAddress AS custAddrB ON custAddrB.CustomerId = c.CustomerId
AND custAddrB.AddressType = "Billing"
LEFT JOIN Address AS bill ON bill.AddressId = custAddrB.AddressId
-- join customer-to-address-resolution for shipping
LEFT JOIN CustomerAddress AS custAddrS ON custAddrS.CustomerId = c.CustomerId
AND custAddrS.AddressType = "Shipping"
LEFT JOIN Address AS ship ON ship.AddressId = custAddrS.AddressId
さらに、後者のシステムでは、顧客ごとに複数の配送先住所を持つという頭痛の種の理論的能力が得られます。
後者のシステムの最大の利点は次のとおりです。通りの名前が変更された場合、必要なのは1つのレコードを更新することだけです。言い換えれば、メリットはありません。
はい。これらのアドレスを使用して冗長性を作成するか、データベースにNULL値を含める必要があるため(たとえば、配送と請求のアドレスが同じ場合)、3NFで禁止されています。次のようなものを使用することをお勧めします。
table customer
... | ... | shipping_address_id | billing_address_id |
----+-----+---------------------+--------------------+
x | y | 23 | 24 |
x | y | 25 | 25 |
...
table address
id | address | postcode | city | country |
---+---------+----------+------+---------+
23 | aaaa | 1234 | foo | bar |
24 | sdfsd | 2345 | sdf | sdf |
....
これで、joinを介してアドレスを取得できます