Database-Design

函式依賴的定義是否允許導數值?

  • January 3, 2017

對不起,如果標題中的問題似乎含糊不清。這個問題相當廣泛,這是我能總結的最好的。

我已經閱讀了有關功能依賴性、1nf、2nf 和 3nf 的資訊。據我了解,如果 A -> B 那麼 B 在功能上依賴於 A。換句話說,如果每個 B 只有一個唯一的 A,那麼 B 在功能上依賴於 A。(如果我錯了,請糾正我)

現在考慮下表。

CREATE TABLE sales (
  product_id int,
  product_name varchar,
  year int,
  indirect_sales int,
  direct_sales int,
  total_sales int
);

每行的候選鍵顯然是(product_id,year)。這張桌子似乎是 2nf 但我懷疑這張桌子仍然不是 3nf。原因是我們可以從direct_sales 和indirect_sales 中確定total_sales,因為direct_sales +indirect_sales = total_sales。那麼我們可以稱之為功能依賴嗎?因為對於每個直接和間接銷售,都有一個獨特的總銷售額。您還可以看到這可能會導致更新錯誤。如果您更新 direct_sales,您還必須同時更新 total_sales。

那麼,在標準化的背景下,您將如何處理這個問題?通常,您會創建一個帶有屬性的單獨表,但創建一個包含直接、間接和總銷售額的表似乎是人為的。另外,在嚴格要求3nf 的實際情況下,您將如何處理這個問題。

我提供了一個簡化的範例,因此您可以掌握問題的本質,但我要解決的真正問題是這些表。

CREATE TABLE user (
  user_id int,
  user_name varchar,
  user_login varchar,
  user_password varchar,
  balance int
);

CREATE TABLE transaction (
  transaction_id int,
  user_id int REFERENCES user.user_id,
  amount int
);

這是一個銀行數據庫,用於儲存每個使用者的使用者資訊和交易資訊。我懷疑這不會被視為 3nf,因為餘額始終是使用者交易金額的總和。這會導致更新異常;如果我們更新交易,餘額必須反映它。

你能幫我理解這個嗎?謝謝。

我發現 Ken Downs 的一篇出色的部落格文章闡明了一切:

數據庫技能:第三範式和計算值

基本上,由於派生屬性,上面的表格不是 3NF;3NF 不允許派生屬性。而且,是的,由此得出派生屬性在功能上依賴於它們的源屬性。

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