一千萬個為什麽

搜索

在SQL中描述變量類型的最佳方法

在SQL表結構中翻譯以下問題的最佳方法是什麽:

在文件傳輸應用程序中,我有一個主表,其中包含“上載類型”字段。根據該字段的值(FTP,SFTP,HTTPS,FS副本),記錄將與包含相關詳細信息的相應表(FTPsites,HTTPSSites等)中的其他條目鏈接。

該主表具有幾個類似的“切換”字段(上載,下載,加密,解密和一些與應用程序相關的字段)。

目前,該表針對每個可能的目標表具有不同的字段。這允許我在表上保持完整性約束,但這是很多將為NULL的字段。

是否有更好的架構來解決這個問題?

如果它是相關的,目標數據庫是MS SQL 2008

最佳答案

您所描述的是一個數據庫設計問題,類似於實現表繼承(其中主表是父表,特定於類型的表是子表)。您可以在此處看到有關如何使用SQL Server 2005/2008實現表繼承的非常好的解釋:

http://www.sqlteam.com/article/implementing-表繼承功能於SQL服務器

...但我會根據您的具體情況調整該文章中的設計模式。

首先,您需要一個新表來保存您可能的UploadTypes列表:

create table UploadType 
(
    UploadTypeID int primary key,
    UploadTypeDesc varchar(50)
)

現在,確保您的MasterTable具有UploadType表的外鍵,並在字段MasterTableID和UploadTypeID上向主表添加額外的UNIQUE約束:

create table MasterTable
(
  MasterTableID int primary key, 
  UploadTypeID int references UploadType(UploadTypeID), 
  -- ...Other fields...
  constraint MasterTable_AltPK unique (MasterTableID,UploadTypeID)
)

假設您已將值插入到UploadType表中,以便HTTP上載具有UploadTypeID = 1,FTP上載具有UploadTypeID = 2,並且SFTP上載具有UploadTypeID = 3,您可以按如下方式設置特定於上載的表(解釋)最後):

create table HTTPSites 
(
  HTTPSiteID int primary key, 
  UploadTypeID as 1 persisted, -- computed column; explanation below
  -- ...Other fields...
  foreign key (MasterTableID, UploadTypeID) references MasterTable(MasterTableID, UploadTypeID)
)

create table FTPSites 
(
  FTPSiteID int primary key, 
  UploadTypeID as 2 persisted,
  -- ...Other fields...
  foreign key (MasterTableID, UploadTypeID) references MasterTable(MasterTableID, UploadTypeID)
)

create table SFTPSites 
(
  SFTPSiteID int primary key, 
  UploadTypeID as 3 persisted,
  -- ...Other fields...
  foreign key (MasterTableID, UploadTypeID) references MasterTable(MasterTableID, UploadTypeID)
)

這些特定於類型的表中的每一個都包括MasterTableID上的主表的雙鍵外鍵和UploadTypeID(這是您獲得參照完整性的方式),每個表都包含一個反映特定類型的UploadTypeID的計算列上傳存儲在該表中。這些計算列中的每一個都將強制使用特定的UploadTypeID創建插入到這些特定於類型的表中的任何新記錄,從而將表鎖定為特定的上載類型。

這種設計的優點在於它為您提供了數據庫驅動的引用約束,滿足您的所有數據完整性要求,而不會產生大量空值。您可以查看上面發布的文章,了解如果您想要深入了解此模式如何在插入,刪除等過程中防止數據完整性問題的詳細示例。

轉載註明原文: 在SQL中描述變量類型的最佳方法