Database-Design

就我的第一個銀行系統數據庫設計尋求有關 3NF 的建議

  • December 7, 2021

就像我在問題中說的那樣,這是我第一次嘗試數據庫設計和規範化,我想實現 3NF。一般情況是一個基本的銀行系統,它允許貸款和多筆交易,每個客戶都需要電子郵件,並且在設置帳戶時電話詳細資訊也必須有期初餘額(超過 50 英鎊)。

我做了很多研究,認為它是在 3NF 中,但需要一些知道他們在做什麼的專業人士來告訴我我可能在哪裡做錯了,以及進一步擴展這個設計的任何提示。

在此處輸入圖像描述

我看到幾個問題:

  • transactions.running_balance不是交易的屬性,它是非規範化的屬性,因為您應該能夠 SUM() 貸方和借方並以這種方式獲得執行餘額。如果您也儲存合計值,它可能會與實際執行餘額不一致。我的意思是,如果您要檢查儲存的執行餘額,然後對所有先前的交易進行 SUM(),但它的總和不正確,該怎麼辦?你怎麼知道哪一個是正確的?
  • transactions有一個 DATE 和一個 DATETIME 列。這兩個都應該是交易的日期嗎?為什麼是兩列,而不僅僅是一個 DATETIME 列?如果它們有不同的日期,即 DATE 有 ‘2021-11-06’ 而 DATETIME 有 ‘2021-11-16 00:00:00’,這意味著什麼?
  • 我說不清address.customer_id是為了什麼。也許它滿足 3NF,但我不能說,因為我從這張圖中看不到它的目的。也許這是您認為每個地址都特定於一個客戶時的遺留問題?
  • 您可能需要另一張表來支付貸款,因為可能會有多筆付款,每筆付款的金額和日期都不同。然後也許還有一張滯納金的桌子。

許多事情看起來“正確”。這裡有一些挑剔的。

  • 銀行業對四捨五入有嚴格的規定。 FLOAT是用於金錢或什至的錯誤數據類型monthly_rate。見DECIMAL
  • 您可能希望保持Loans原始狀態。也就是說,找其他地方放置下個月的到期日。
  • Transactions可以使用金額的符號來確定“貸方”與“借方”。
  • 你有一個額外的customer_id.
  • 多對多之間CustomerAddress可能是矯枉過正。
  • 您將如何使用加入帳戶代表夫妻?
  • 表是否設置為處理從支票賬戶自動付款以償還貸款?

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