在SQL中描述变量类型的最佳方法

时间:2010-04-13 15:35:49

标签: sql

在SQL表结构中翻译以下问题的最佳方法是什么:

在文件传输应用程序中,我有一个带有“上传类型”字段的主表。根据该字段的值(FTP,SFTP,HTTPS,FS副本),记录将与包含相关详细信息的相应表(FTP站点,HTTPSSites等)中的其他条目链接。

这个主表有几个类似的“切换”字段(上传,下载,加密,解密和一些与应用相关的字段)。

目前,该表针对每个可能的目标表具有不同的字段。这允许我保持对表的完整性约束,但这是很多将为NULL的字段。

是否有更好的架构来解决这个问题?

如果相关,目标数据库是MS SQL 2008

1 个答案:

答案 0 :(得分:3)

您所描述的是一个数据库设计问题,类似于实现表继承(其中主表是父表,特定于类型的表是子表)。您可以在此处看到有关如何使用SQL Server 2005/2008实现表继承的非常好的解释:

http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server

...但我会根据您的具体情况调整该文章中的设计模式。

首先,您需要一个新表来保存您可能的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创建插入到这些特定于类型的表中的任何新记录,从而将表锁定为特定的上载类型。

这种设计的优点在于它为您提供了数据库驱动的引用约束,满足您的所有数据完整性要求,而不会产生大量空值。您可以查看上面发布的文章,详细了解此模式如何在插入,删除等过程中防止数据完整性问题的详细示例。