Sql-Server

哪個表獲得 FK?這裡有明確的親子關係嗎?

  • July 16, 2020

我有以下表格:

零件-產品線關係

每個ProductLine將包含許多Parts。出於這個原因,最初在我看來,該Part表是該表的一個子ProductLine表。然而,零件不僅僅是產品線的延伸,當我問自己是否有可能沒有產品線的零件存在時,答案似乎是肯定的。

所以我想知道上面的設計是否正確,或者是否有更好的設計。在Part表中,PartBase可以將其視為每個零件的唯一標識符(如果您願意,請輸入零件編號。)

作為一個有點不相關的問題,我將這些表設置為一對多關係。既然每個都Part必須屬於一個ProductLine但不能屬於多個,那麼將其作為一個一對多的關係是否更正確?唯一的區別是 a必須在實際數據庫中Part包含 not null嗎?ProductLineNumber這與要求ProductLineNumber不為空有什麼不同?

要跟進@HandyD 的評論,作為一項業務規則,每個部分都必須完全屬於一個產品線。但是,當我將零件視為物理對象時,它不應該需要存在產品線(產品線畢竟只是一個標籤。)我在這裡比較的是銷售如何需要客戶進行從某種意義上說,這樣一張Sale桌子就會更清楚地是一張Customer桌子的孩子。這種區別Part-ProductLineSale-Customer是錯誤的嗎?

如果業務需求是

一條業務規則,每個元件必須完全屬於一個產品線。

因此,如果規則是,每個部分都屬於一個產品線,那麼該關係的另一端是每個產品線包含零對多的部分,這應該讓您相信這是父/子關係的明確實例。

事物在現實世界中的存在方式與在業務環境/數據庫中的存在方式並不總是緊密相關。如果我的辦公桌上有一個零件,我不在乎它的產品線。但是,如果我是一家企業並且我正在銷售零件,我可能需要對該零件進行分類以用於搜尋/報告/銷售/佣金目的。

即使上下文可能不同(每個部分都由一個Part Type/PartType 描述零對多的 Parts 等)。

不會涉及列類型或設計的其他方面,因為這與問題無關,但我很樂意在其他地方提供指導。

Part表中,

PartID int PK
PartBase varchar(20) AK
PopularityCode char(20) 

同樣在ProductLineTable 中,PK列應該是INT數據類型。

即使ProductLinetable 很小,也可能是 Huge Table 中的 FK。所以如果ProductLineNumber varchar(20)是 Index 那麼它可能會影響性能。

所以應該是

ProductLine Table

ProductLineID int PK
ProductLineNumber varchar(20) AK

ProductLineID 應在其他列中引用。

現在來主要問題。

外鍵也可以為空。

因此,如果根據您的業務。需求,Part cannot exists without Product Line那麼,

create table Part (
   Partid int   ,
   PartBase varchar(20) not null,
   ProductLineID int   not null,
   primary key(PartID,ProductLineID)

);

PartID,ProductLineID複合主鍵也是如此。

如果Part can exists of its own Product Line那麼ProductLineID將是Nullable FK

那麼主要問題是,

How many nullable ProductLineID  rows will be there in Part table ?



create table Part (
   Partid int  primary key ,
   PartBase varchar(20) not null,
   ProductLineID int  null,
   PopularityCode char(20)     
);

我假設 Nullable ProductLineID 行將是非常微不足道的 1% 或 2%。

在那種情況下Create Unique Filtered index

CREATE UNIQUE  INDEX 
   FUX_Part_ProductLine
ON dbo.Part 
   (Partid,ProductLineID ) 
WHERE 
   ProductLineID IS NOT NULL ;

你什麼時候提到過PopularityCode

即使PopularityCode 沒有提到問題,即使沒有問題Partial Dependency,我們仍然需要映射表。

所以零件表的新設計,

create table Part (
       Partid int  primary key ,
       PartBase varchar(20) not null,
       PopularityCode char(20)     
   );

創建映射表

create table ProductLine_Part_Mapping (
       Partid int  not null ,
       ProductLineID int  not null,
       primary key(PartID,ProductLineID)
   );

最好以一對多或多對多關係創建映射表。

當記錄數以百萬計時,它特別有用。

不管Partid是不是獨立的,這個設計都可以。

如果你提到類似的事情,

一個 Productline 可能包含多少個 PartID ?每個表中有多少行?

這些問題有助於製作索引。

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