首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在SQL中描述变量类型的最佳方法

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

Stack Overflow用户
提问于 2010-04-13 15:35:49
回答 1查看 192关注 0票数 2

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

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

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

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

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

如果与之相关,则目标数据库为MS SQL 2008

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-13 18:25:51

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

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

...but我将根据您下面的具体情况调整那篇文章中的设计模式。

首先,您需要一个新表来保存可能的UploadTypes列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create table UploadType 
(
    UploadTypeID int primary key,
    UploadTypeDesc varchar(50)
)

现在,确保您的MasterTable具有指向UploadType表的外键,并在主表的字段MasterTableID和UploadTypeID上添加额外的唯一约束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,您现在可以设置特定于上载的表,如下所示(最后的解释):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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创建插入到这些特定类型的表中的任何新记录,从而将这些表锁定为特定的上载类型。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2630906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文