1

之間的依賴關係目前的結構如下兩個外鍵:SQL - 這讓他們

Table RowType: RowTypeID 

Table RowSubType: RowSubTypeID 
        FK_RowTypeID 

Table ColumnDef: FK_RowTypeID 
        FK_RowSubTypeID (nullable) 

總之,我映射列定義的行。在某些情況下,這些行具有子類型,它們將具有特定於其的列定義。或者,我可以將特定於子類型的列定義從他們自己的表中掛起,或者我可以將RowType和RowSubType中的數據組合到一個表中並使用單個ID,但我不確定哪個是更好的解決方案(如果有的話,我會傾向於後者,因爲我們大多最終會爲給定的RowType/RowSubType拉動ColumnDefs)。

是當前設計的SQL褻瀆嗎?

如果我保留當前結構,如何保持,如果RowSubTypeID在ColumnDef中指定,它必須對應RowTypeID指定的RowType?我是否應該嘗試用觸發器強制執行此操作,還是錯過了可以解決問題的簡單重新設計?

+0

行類型和行子類型有多相似/不相似?是否有可能需要進一步嵌套(如子子類型)? – 2010-06-02 17:32:54

+0

你想在這裏動態生成表格嗎?我認爲你是過度工程。 – Seth 2010-06-02 17:36:59

+0

嘗試從各種數據源定義映射,其中一些非常難看。我們的目標是在sql中定義它們,以便工作流可以獲取適當的配置並處理數據。我試圖解開一個一般會工作的設計變得相當混亂的問題。 – Brian 2010-06-02 18:03:18

回答

4

您遇到的問題是Fourth Normal Form

這裏的解決方案:

Table RowSubType:  RowSubTypeID 
         FK_RowTypeID 
         UNIQUE(FK_RowTypeID, RowSubTypeID) 

Table ColumnDef:  ColumnDefID 
         FK_RowTypeID 
         UNIQUE(ColumnDefID, FK_RowTypeID) 

Table ColumnDefSubType: FK_ColumnDefID } compound foreign key to ColumnDef 
         FK_RowTypeID  } } 
         FK_RowSubTypeID  } compound foreign key to RowSubType 

你只需要創建在ColumnDefSubType表中的一行有一行亞型列。但所有引用都受到限制,因此您無法創建異常。

但是對於它的價值,我同意@塞思關於可能的過度工程的評論。我不確定我是否理解你是如何使用這些列定義和行類型的,但它聞起來像是反模式(Inner-Platform Effect)。在SQL中,只需使用元數據來定義元數據即可。不要嘗試使用數據來創建動態模式。

另請參閱這個優秀的故事:Bad CaRMa


重新評論:在你的情況下,我建議使用類表繼承或混凝土表繼承。這意味着爲每個子類型定義一個單獨的表。但是原始文本記錄的每一列都將進入子類型表的相應列。這樣你就不需要擁有你的rowtype或rowubtype表,通過爲每個子類定義表是隱含的。而且你不需要你的columndefs表,這是由表中定義的列隱含的。

另請參閱我的回答Product table, many kinds of product, each product has many parameters或我的演示幻燈片Practical Object-Oriented Models in SQL

+0

我不確定這是否符合我們的情況......我只是沒有看到它?我們有這些表格映射的可能有子類型的文本數據行。這些子類型由實際行(ugh)中的列指定,以便特定類型子行的行將具有可變列數據(列數,列類型,固定寬度的起始和停止位置等)。我需要能夠檢索特定類型 - 子類型組合的所有列定義(包括那些不定義子類型的行類型的空子類型) – Brian 2010-06-02 18:45:47

+0

定義每個子類型的單獨表的問題是它會打破靈活性,這是將映射放在表格中的全部原因。我們的目標是一個導入/處理引擎,它是數據驅動的,並且足夠靈活以便能夠處理不同的數據源(我可能應該從一開始就提到這一點)。將rowtype和rowsubtype表合併到一個表中更合理,即使這比我原來的方向更加醜陋。使用觸發器來保持最初的設計看起來很詭異,但我還是很想動手。不過,我寧願找一個替代品。 – Brian 2010-06-03 00:02:23

+0

(另外,性能不需要考慮) – Brian 2010-06-03 00:02:53

相關問題