背景
我有一个用于从平面文件导入数据的应用程序。有一个ImportJob表,其中包含导入作业详细信息(作业名称,作业计划等)和源文件配置详细信息(文件名,文件格式等)。
现在,我需要添加更多数据源,以便应用程序可以从数据库,Web服务等导入数据。
每个导入作业始终只有一个数据源。
当前(简化)表格结构 -
ImportJob - Id, JobName, JobStartTime, SourceFileName, SouceFileDelimiter
问题 我应该如何对其进行重组以便我可以添加更多源类型,但仍然确保每个导入作业只有一种源类型? (它在Sql Server中)
我正在考虑以下解决方案 -
将新源类型的列添加到同一个表中,并使用“SourceType”字段确定要从中获取数据的列 -
ImportJob table - Id, JobName, JobStartTime, SourceType, SourceFileName, SourceFileDelimiter, SourceWebServiceLink, SourceWebServiceUserName, SourceDBServer, SourceDBName etc
问题 - 对于任何源类型,大多数列都是空的。随着越来越多的资源被添加,这个表可能会变得非常宽(非常空)。
为每个源创建单独的“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之间的关系不可强制执行。
有没有标准/理想的方式对此进行建模?
答案 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%实施关系,但你有一个约定可能会限制错误。如果您仍然希望系统严格执行规则(“一对一约束”),那么您应该检查一下快速简报,以便为您的数据库供应商系统实现表继承。