哪個表獲得 FK?這裡有明確的親子關係嗎?
我有以下表格:
每個
ProductLine
將包含許多Part
s。出於這個原因,最初在我看來,該Part
表是該表的一個子ProductLine
表。然而,零件不僅僅是產品線的延伸,當我問自己是否有可能沒有產品線的零件存在時,答案似乎是肯定的。所以我想知道上面的設計是否正確,或者是否有更好的設計。在
Part
表中,PartBase
可以將其視為每個零件的唯一標識符(如果您願意,請輸入零件編號。)作為一個有點不相關的問題,我將這些表設置為一對多關係。既然每個都
Part
必須屬於一個ProductLine
但不能屬於多個,那麼將其作為一個一對多的關係是否更正確?唯一的區別是 a必須在實際數據庫中Part
包含 not null嗎?ProductLineNumber
這與要求ProductLineNumber
不為空有什麼不同?要跟進@HandyD 的評論,作為一項業務規則,每個部分都必須完全屬於一個產品線。但是,當我將零件視為物理對象時,它不應該需要存在產品線(產品線畢竟只是一個標籤。)我在這裡比較的是銷售如何需要客戶進行從某種意義上說,這樣一張
Sale
桌子就會更清楚地是一張Customer
桌子的孩子。這種區別Part
-ProductLine
和Sale
-Customer
是錯誤的嗎?
如果業務需求是
一條業務規則,每個元件必須完全屬於一個產品線。
因此,如果規則是,每個部分都屬於一個產品線,那麼該關係的另一端是每個產品線包含零對多的部分,這應該讓您相信這是父/子關係的明確實例。
事物在現實世界中的存在方式與在業務環境/數據庫中的存在方式並不總是緊密相關。如果我的辦公桌上有一個零件,我不在乎它的產品線。但是,如果我是一家企業並且我正在銷售零件,我可能需要對該零件進行分類以用於搜尋/報告/銷售/佣金目的。
即使上下文可能不同(每個部分都由一個Part Type/PartType 描述零對多的 Parts 等)。
不會涉及列類型或設計的其他方面,因為這與問題無關,但我很樂意在其他地方提供指導。
如
Part
表中,PartID int PK PartBase varchar(20) AK PopularityCode char(20)
同樣在
ProductLine
Table 中,PK
列應該是INT
數據類型。即使
ProductLine
table 很小,也可能是 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 ?每個表中有多少行?
這些問題有助於製作索引。