Sql-Server

在數據庫設計中處理子類型和超類型

  • February 27, 2019

我目前正在為一個類做一個數據庫項目,我在處理子類型和超類型時遇到了一些困難。這是實體及其屬性的列表:

Piece (PIECE_ID, Description) 
  In_house (PIECE_ID)
     Bulk (PIECE_ID, Location)
     To order (PIECE_ID, Lead time) 
  Purchased (PIECE_ID, Cost)
Order (OID, Order date)
Supplier (SID, Name, Postcode, City )
Supplier piece (SPID, Price, description)

澄清一下,Piece 是具有兩個子類型 In_house 和 Purchased 的超類型。In_house 然後有兩個子類型,Bulk 和 To Order。

我的第一個直覺是保留一個表 Piece(PIECE_ID, description),另一個用於 Purchased(PIECE_ID, cost),然後刪除 In_house 並僅保留子類型 Bulk(PIECE_ID, Location) 和 To_order(PIECE_ID, Lead Time )。

第一個問題:與保留 In_house 表並將 Bulk 和 To_order 資訊都放在該表中,生成一些 NULL 值相比,這是否更好?

此外,系統如何知道 Purchased、Bulk 和 To_order 表中不能有任何重複的 PIECE_ID?我是否需要為這些單獨的表創建一個單獨的 ID,或者它們可以只是 Piece 表的外鍵?

最後,Purchable 表對與 Supplier 零件表的關係具有 1:N 的強制性。因此,我必須將 Purchased 表的主鍵放在 Supplier 表中。如果 Purchased 上的主鍵只是 PIECE_ID,那麼如何關聯這些 PIECE_ID 來自 Purchased 表而不是來自以 PIECE_ID 作為主鍵的其他表?

如果需要澄清,請在評論中告訴我。

不確定我是否理解您的所有問題,但超/子類型的一個相當常見的模型是向您的超類型添加分類器屬性:

CREATE TABLE super
( xxx_id ... not null primary key
, classifier int not null
,   unique (classifier, xxx_id)
,   check (classifier in (1,2,...))
)

CREATE TABLE sub1
( xxx_id ... not null primary key
, classifier int default 1 not null
,    check (classifier = 1)
,     foreign key (classifier,xxx_id)
         references super (classifier,xxx_id)
)

CREATE TABLE sub2
( xxx_id ... not null primary key
, classifier int default 2 not null
,    check (classifier = 2)
,     foreign key (classifier,xxx_id)
         references super (classifier,xxx_id)
)

現在 super 中的分類器保證例如 1 不能位於 sub2 中(它存在於任何子類型中由事務處理)。

然而,如果分類器發生變化,這個模型並不完全實用,所以這更像是一個值得深思的答案(但它太長了,不能成為評論)。

一個重要的決定因素是性能與程式碼複雜性的業務偏好。

如果性能很關鍵,那麼程式碼複雜性就會退居二線。在這種情況下,您可能希望通過在主表中不包含很少使用的列來確保盡可能緊湊地保持關鍵行。

如果認為程式碼簡單性是最重要的,那麼性能就會退居二線,從而提供更廣泛的可能性。

SQL Server 有一個很少實現的功能,稱為稀疏列,它允許具有較大比例的空值與非空值的列的儲存效率更高。因此,如果 90% 的部分是“內部”的,那麼您可以為主表中“購買”的 10% 添加稀疏列,而不必太擔心讀取這些行的性能影響,而確保所有這些 NULL 值盡可能節省空間。

通常情況下,魔鬼在細節中,並且很大程度上取決於特定業務的要求。

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