翻译SQL表结构中的以下问题的最佳方法是什么:
在文件传输应用程序中,我有一个带有"Upload type“字段的主表。根据该字段的值(FTP、SFTP、HTTPS、FS copy),记录将与相应表格(FTPsites、HTTPSSites等)中的其他条目链接。包含相关详细信息的。
这个主表有几个类似的“切换”字段(上传、下载、加密、解密和一些与应用程序相关的字段)。
目前,对于每个可能的目标表,该表都有一个不同的字段。这允许我在表上保持完整性约束,但有很多字段将为空。
有没有更好的方案来解决这个问题?
如果与之相关,则目标数据库为MS SQL 2008
发布于 2010-04-13 18:25:51
您所描述的是一个类似于实现表继承的数据库设计问题(主表是父表,特定类型的表是子表)。你可以在这里看到关于如何在SQL Server 2005/2008中实现表继承的很好的解释:
http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server
...but我将根据您下面的具体情况调整那篇文章中的设计模式。
首先,您需要一个新表来保存可能的UploadTypes列表:
create table UploadType
(
UploadTypeID int primary key,
UploadTypeDesc varchar(50)
)
现在,确保您的MasterTable具有指向UploadType表的外键,并在主表的字段MasterTableID和UploadTypeID上添加额外的唯一约束:
create table MasterTable
(
MasterTableID int primary key,
UploadTypeID int references UploadType(UploadTypeID),
-- ...Other fields...
constraint MasterTable_AltPK unique (MasterTableID,UploadTypeID)
)
假设您已经在UploadType表中插入了值,以便HTTP uploads具有UploadTypeID = 1,FTP uploads具有UploadTypeID = 2,SFTP uploads具有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创建插入到这些特定类型的表中的任何新记录,从而将这些表锁定为特定的上载类型。
这种设计的美妙之处在于,它为您提供了数据库驱动的引用约束,可以满足您的所有数据完整性要求,而不会有很多空值。如果您想深入了解此模式如何在插入、删除等过程中防止数据完整性问题,您可以查看上面发布的文章以获取详细的示例。
https://stackoverflow.com/questions/2630906
复制相似问题