1-1的数据库设计,其中一侧外键引用多个表?

时间:2016-09-22 07:21:14

标签: sql-server database

背景

我有一个用于从平面文件导入数据的应用程序。有一个ImportJob表,其中包含导入作业详细信息(作业名称,作业计划等)和源文件配置详细信息(文件名,文件格式等)。

现在,我需要添加更多数据源,以便应用程序可以从数据库,Web服务等导入数据。

每个导入作业始终只有一个数据源。

当前(简化)表格结构 -

ImportJob - Id, JobName, JobStartTime, SourceFileName, SouceFileDelimiter

问题 我应该如何对其进行重组以便我可以添加更多源类型,但仍然确保每个导入作业只有一种源类型? (它在Sql Server中)

我正在考虑以下解决方案 -

  1. 将新源类型的列添加到同一个表中,并使用“SourceType”字段确定要从中获取数据的列 -

    ImportJob table - Id, JobName, JobStartTime, SourceType, SourceFileName, SourceFileDelimiter, SourceWebServiceLink, SourceWebServiceUserName, SourceDBServer, SourceDBName etc
    

    问题 - 对于任何源类型,大多数列都是空的。随着越来越多的资源被添加,这个表可能会变得非常宽(非常空)。

  2. 为每个源创建单独的“Source”表,并使用ImportJob表中的“shared”外键引用它们 -

    ImportJob table - Id, JobName, JobStartTime, SourceType, SourceId (foregin key)
    SourceFile table - SourceId (primary), SourceFileName, SourceFileDelimiter
    SourceWebService table - SourceId (primary), SourceWebServiceLink, SourceWebServiceUserName
    SourceDB table - SourceId (primary), SourceDBServer, SourceDBName
    

    问题 - 应用程序将使用ImportJob中的SourceType字段来确定密钥所属的SourceXXX表。此外,ImportJob中SourceType和SourceId之间的关系不可强制执行。

  3. 有没有标准/理想的方式对此进行建模?

1 个答案:

答案 0 :(得分:0)

两者都有效。只要有很少的来源,示例一非常简单易懂,但最终您应该重构示例二。我想我会改变示例二模仿这样的“继承”,所以表结构/命名“传达”意图:

ImportJob - Id,JobName ... Source_Id(FK)

来源 - Id(PK),类型

SourceFile - Source_Id(PK / FK),....

SourceWebService - Source_Id(PK / FK),....

或者像这样:

ImportJob - Id,JobName,Type ...

ImportJobSourceFile - ImportJob_Id(PK / FK),....

ImportJobSourceWebService - ImportJob_Id(PK / FK),...。

它仍然没有100%实施关系,但你有一个约定可能会限制错误。如果您仍然希望系统严格执行规则(“一对一约束”),那么您应该检查一下快速简报,以便为您的数据库供应商系统实现表继承。