Mysql

如何維護訂單的客戶地址?

  • December 22, 2021

我正在設計的數據庫是我正在進行的項目的一部分。我提出了 3 個簡單的“業務規則”:

  • 客戶必須是個人或企業(企業屬於某種類型)。
  • 客戶必須至少下一個訂單。
  • 訂單必須包含其歷史收貨地址(即,如果客戶更新其地址,則與客戶相關的任何訂單都必須引用舊地址)。

根據上述要求,我提出了以下設計:

在此處輸入圖像描述

但是,標準化存在問題。

為了滿足第三個要求,我在創建時將送貨地址保存到訂單中。此外,我引用了 Customer 表中的地址(可能相同)。

在圖像的右下角,我將與地址相關的屬性提取到自己的表中,作為我嘗試規範化設計的第一步。

在過去的一周裡,我一直在尋找沒有太多運氣的提示。我知道這篇文章這篇文章,但是對於我的場景/案例來說,實現相當模糊。

製作一個包含所有地址的表格,然後根據需要引用每個地址的想法已經閃過我的腦海,但似乎不是實現這一目標的正確(更不用說最好)方式。

我的問題很簡單:

如何滿足將地址與歷史上的客戶和訂單相關聯的第三個要求,同時考慮到規範化?

很感謝任何形式的幫助。乾杯。

您在 3 個表格中有地址。將其縮小到 1。然後customer_address_idCustomers表格和表格ship_address_id中都有一個Orders。然後,ship_address_id可以為空。不要將所有欄位都Addresses設為 Nullable。(也許region和/或post_code可以留空——但用它們DEFAULT ''代替NULLable.

如果客戶正在向自己“運送”,只需將其複製customer_address_idOrders.ship_address_id.

還有一件事……為了不失去“舊地址”,請注意何時(如果有的話)更改Addresses. 您最終可能會得到未使用的條目,但這對於您需要的數據完整性來說是一個很小的代價。

我建議,如果您要引入專用Address實體(表和類),則該實體應負責使用外鍵處理所有地址並刪除表內地址列。這將減少在表之間複製地址數據時的程式碼重複和潛在的錯誤(首先不需要)。

為了確保歷史數據的完整性,您可以將地址設置為不可變的業務規則。當客戶更新其帳戶中的地址時,請使用更新的詳細資訊創建原始副本,並在適當的情況下將帳戶的地址 ID 重新分配給更新的副本。

這將確保歷史訂單連結到不可變地址,同時無需為每個訂單複制地址。

您更新客戶地址的頻率通常遠低於創建訂單的頻率。

引用自:https://dba.stackexchange.com/questions/224609