如何維護訂單的客戶地址?
我正在設計的數據庫是我正在進行的項目的一部分。我提出了 3 個簡單的“業務規則”:
- 客戶必須是個人或企業(企業屬於某種類型)。
- 客戶必須至少下一個訂單。
- 訂單必須包含其歷史收貨地址(即,如果客戶更新其地址,則與客戶相關的任何訂單都必須引用舊地址)。
根據上述要求,我提出了以下設計:
但是,標準化存在問題。
為了滿足第三個要求,我在創建時將送貨地址保存到訂單中。此外,我引用了 Customer 表中的地址(可能相同)。
在圖像的右下角,我將與地址相關的屬性提取到自己的表中,作為我嘗試規範化設計的第一步。
在過去的一周裡,我一直在尋找沒有太多運氣的提示。我知道這篇文章和這篇文章,但是對於我的場景/案例來說,實現相當模糊。
製作一個包含所有地址的表格,然後根據需要引用每個地址的想法已經閃過我的腦海,但似乎不是實現這一目標的正確(更不用說最好)方式。
我的問題很簡單:
如何滿足將地址與歷史上的客戶和訂單相關聯的第三個要求,同時考慮到規範化?
很感謝任何形式的幫助。乾杯。
您在 3 個表格中有地址。將其縮小到 1。然後
customer_address_id
在Customers
表格和表格ship_address_id
中都有一個Orders
。然後,ship_address_id
可以為空。不要將所有欄位都Addresses
設為 Nullable。(也許region
和/或post_code
可以留空——但用它們DEFAULT ''
代替NULLable
.如果客戶正在向自己“運送”,只需將其複製
customer_address_id
到Orders.ship_address_id
.還有一件事……為了不失去“舊地址”,請注意何時(如果有的話)更改
Addresses
. 您最終可能會得到未使用的條目,但這對於您需要的數據完整性來說是一個很小的代價。
我建議,如果您要引入專用
Address
實體(表和類),則該實體應負責使用外鍵處理所有地址並刪除表內地址列。這將減少在表之間複製地址數據時的程式碼重複和潛在的錯誤(首先不需要)。為了確保歷史數據的完整性,您可以將地址設置為不可變的業務規則。當客戶更新其帳戶中的地址時,請使用更新的詳細資訊創建原始副本,並在適當的情況下將帳戶的地址 ID 重新分配給更新的副本。
這將確保歷史訂單連結到不可變地址,同時無需為每個訂單複制地址。
您更新客戶地址的頻率通常遠低於創建訂單的頻率。