Sql-Server

在 SQL Server 中的表上有多個可為空的 FK 是否被視為一種不好的做法

  • February 20, 2012

在我的 SQL Server 數據庫結構中,我有 3 種類型的產品,它們需要有關訂單的不同資訊。因此,我創建了一個Customers表和三個不同的訂單表:OrdersForProductAsOrdersForProductBsOrdersForProductCs。所有訂單表在表上都有一對多的關係Customers

我還有另一張桌子,裡面Payments會保存付款詳情。但我對如何建構它有疑問。

由於我有多種產品類型,並且客戶可能同時訂購多種產品,因此我需要將這三個訂單表關聯到Payments表。

另一個問題是客戶可能只訂購一種產品。因此,表上的 FK 列Payments需要是nullable.

我的問題是nullable,從長遠來看,這些 FK 列是否會讓我頭疼?一般來說,在表上具有可為空的 FK 列是否會被視為一種不好的做法?

我會質疑你為什麼有OrdersForProductX桌子

你問的FK問題可能可以設計出來……

如果這些表具有相同的結構,那麼您只需要ProductType某個表上的列OrderProduct。然後Payment用一個 FK 連結到那個

如果表有不同的結構,我假設它們有一些共同的屬性。因此,您可以有一個公用OrderProduct表,然後是每個產品類型的特定子表(見下文)同樣,Payment只需使用一個 FK 連結到公用表

這是“超級鍵/子類型模式”

  • UQ1 是在子類型表上使用外鍵的“超級鍵”
  • 每個子類型表都有一個組合的 PK 和 FK(OrderID, ProductType)
  • 每個子類型表都有一個 CHECK 約束來限制該表中的類型

訂購產品

  • OrderID, PK, UQ1
  • 產品類型,UQ1
  • 普通事物1

訂購產品A

  • 訂單ID,PK,FK
  • 產品類型,PK,FK,檢查產品類型 = A
  • 產品AThing1

訂購產品B

  • 訂單ID,PK,FK
  • 產品類型,PK,FK,檢查產品類型 = B
  • 產品BThing1

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