2010-04-13 93 views
2

变量类型什么是翻译在SQL表结构如下问题的最好办法:最好的方式来描述在SQL

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

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

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

有没有更好的方案来解决这个问题?

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

+0

您的主表中的一行数据代表什么?此外,你能列出所有“可能的目标表” - 很难讨论而不知道它们是什么。 (UploadType列听起来完全合适。) – 2010-04-13 15:41:35

+0

当你说“目前,表中每个可能的目标表都有不同的字段”时,你的意思是与通过ftp上传/下载的文件相对应的记录将具有“HTTPSsites”等列,并且“网站”栏)只有“FTPsites”不会是NULL?如果是这样,相反,你可能会有一个单独的2列表(协议,表名),它具有(“FTP”,“FTPsites”)等。另外(这不是严格的答案),你可能想为了清楚起见,将“上传类型”列重命名为“传输协议”或“协议”(特别是如果您还要处理下载)。 – yarmiganosca 2010-04-13 16:00:29

回答

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表并添加一个额外的UNIQUE约束到您的主表上的字段MasterTableID和UploadTypeID:

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一起创建,因此会将这些表锁定为特定的上载类型。

这种设计的美妙之处在于,它为您提供数据库驱动的参考约束,可满足您的所有数据完整性要求,而无需大量空值。你可以看到上面发表的文章,了解这个模式如何在插入,删除等过程中防止数据完整性问题的详细例子,如果你想更深入的话。

+0

谢谢你这个非常详细的答案:这正是我所期待的。 – Stephane 2010-04-16 06:38:47

+0

没问题 - 我的荣幸! – 2010-04-16 13:22:33