0

Shipping address、、を1つのテーブルShipping postcodeに入れる必要があります。Billing AddressBilling PostcodeCustomer

それは3NFに違反しますか?

4

2 に答える 2

1

それは3NFに違反しますか?

非常に厳密に言えば:はい。

実際には:いいえ。

計画していない場合:

  • データベースに専用の「アドレス」エンティティを含める(つまり、アドレスが顧客レコードに添付されたフリーテキストにすぎない場合)
  • 顧客ごとに可変量のアドレスを持つ(ただし2つのみ)
  • 選択したいすべてのアドレスにLEFTJOINを書き込む必要があります...

...それからあなたのデザインに固執します。

アドレスを別のテーブルに正規化することは、名前と名前が繰り返される傾向があるという理由だけで、名前と姓を別々のテーブルに正規化するのとほぼ同じくらい賢明です。しないでください。


「実用的」と考える

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つのレコードを更新することだけです。言い換えれば、メリットはありません。

于 2012-11-08T14:02:49.170 に答える
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を介してアドレスを取得できます

于 2012-11-08T14:04:19.527 に答える