Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中描述变量类型的最佳方法_Sql - Fatal编程技术网

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

在SQL中描述变量类型的最佳方法,sql,Sql,翻译SQL表结构中的以下问题的最佳方法是什么: 在文件传输应用程序中,我有一个带有“上载类型”字段的主表。根据该字段的值(FTP、SFTP、HTTPS、FS copy),记录将与包含相关详细信息的相应表(FTPsites、HTTPSSites等)中的其他条目链接 此主表有几个类似的“开关”字段(上载、下载、加密、解密和一些与应用程序相关的字段) 目前,该表对于每个可能的目标表都有不同的字段。这允许我在表中保留完整性约束,但有很多字段将为NULL 有没有更好的模式来解决这个问题 如果相关的话,目标

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

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

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

目前,该表对于每个可能的目标表都有不同的字段。这允许我在表中保留完整性约束,但有很多字段将为NULL

有没有更好的模式来解决这个问题


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

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

…但我将根据您下面的具体情况调整文章中的设计模式

首先,您需要一个新表来保存可能的上载类型列表:

create table UploadType 
(
    UploadTypeID int primary key,
    UploadTypeDesc varchar(50)
)
现在,确保您的主表具有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上载的UploadTypeID为1,FTP上载的UploadTypeID为2,SFTP上载的UploadTypeID为3,则现在可以按如下方式设置特定于上载的表(最后的说明):

这些类型特定的表中的每一个都包括MasterTableID和UploadTypeID上主表的双键外键(这是获得引用完整性的方式),并且每个表都包括UploadTypeID的计算列,该列反映了存储在该表中的特定上传类型。这些计算列中的每一列都将强制使用特定的UploadTypeID创建插入这些类型特定表中的任何新记录,从而将表锁定为特定的上载类型


这种设计的美妙之处在于,它为您提供了数据库驱动的引用约束,可以满足所有数据完整性要求,而无需大量空值。如果您想更深入地了解此模式如何在插入、删除等过程中防止数据完整性问题,请参阅上面的文章,以获取详细示例。

主表中的一行数据代表什么?另外,你能列出所有“可能的目标表”吗?如果不知道它们是什么,很难讨论。(UploadType列听起来完全合适。)当您说“当前,表中每个可能的目标表都有一个不同的字段”时,您的意思是与通过ftp上载/下载的文件相对应的记录将有“HTTPSsites”等列,并且(在“sites”列中)只有“FTPsites”不会为空吗?如果是这样的话,您可能会使用一个单独的2列表(协议,表名),其中包含(“FTP”、“FTPsites”)等。此外(这不是严格意义上的答案),您可能希望将“上载类型”列重命名为“传输协议”或仅为“协议”以清晰起见(特别是如果您还处理下载)谢谢你的详细回答:这正是我想要的。
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)
)