在SQL表结构中翻译以下问题的最佳方法是什么:
在文件传输应用程序中,我有一个带有“上传类型”字段的主表。根据该字段的值(FTP,SFTP,HTTPS,FS副本),记录将与包含相关详细信息的相应表(FTP站点,HTTPSSites等)中的其他条目链接。
这个主表有几个类似的“切换”字段(上传,下载,加密,解密和一些与应用相关的字段)。
目前,该表针对每个可能的目标表具有不同的字段。这允许我保持对表的完整性约束,但这是很多将为NULL的字段。
是否有更好的架构来解决这个问题?
如果相关,目标数据库是MS SQL 2008
答案 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创建插入到这些特定于类型的表中的任何新记录,从而将表锁定为特定的上载类型。
这种设计的优点在于它为您提供了数据库驱动的引用约束,满足您的所有数据完整性要求,而不会产生大量空值。您可以查看上面发布的文章,详细了解此模式如何在插入,删除等过程中防止数据完整性问题的详细示例。