2016-09-22 45 views
0

背景數據庫設計爲1-1,其中一邊外鍵引用多個表?

我有用於從平面文件導入數據的應用程序。有一個ImportJob表包含導入作業詳細信息(作業名稱,作業計劃等)和源文件配置詳細信息(文件名,文件格式等)。

現在,我需要添加更多的數據源,這樣應用程序可以從數據庫中導入數據,Web Services等

總會有隻有一個每項匯入工作的數據源。

電流(簡體)表結構 -

ImportJob - Id, JobName, JobStartTime, SourceFileName, SouceFileDelimiter 

問題 我應該如何重組,這樣我可以添加更多的源類型,但仍保證會有每項匯入工作的只有一個來源類型? (這是在SQL Server)的

我考慮了以下解決方案 -

  1. 新源類型的列添加到同一個表,並使用「SourceType中」現場找出得到哪些列數據來自 -

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

    問題 - 對於任何源類型,大多數列將爲空。隨着越來越多的資源被添加,此表格可能會變得非常寬(並且非常空)。

  2. 對於每個源創建單獨的「源」的表和與所述ImportJob表一個「共享」外鍵引用它們 -

    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

兩者都有效。例子一是非常簡單和容易理解,只要有很少的來源,但最終你應該重新對例子二進行重構。我想我會改變例如兩個模仿「繼承」這樣使表結構/命名「溝通」的意圖:

ImportJob - 標識,作業名... SOURCE_ID(FK)

源 - ID(PK) ,類型

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

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

或者這樣:

ImportJob - 標識,作業名,類型...

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

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

它仍然沒有強制關係100%,但你有一個約定,可能會限制錯誤。如果您仍然希望系統嚴格執行規則(「一對一約束」),那麼您應該檢查一下爲數據庫供應商系統實現表繼承的快速簡介。

相關問題