2013-03-07 65 views
2

我正在構建一個檢測表可以連接在一起的系統。例如,在兩個簡單表格的情況下 - 如果Table A有一個主鍵鏈接到Table B中的外鍵,那麼系統會檢測到兩個表格之間可以進行連接。到目前爲止,這在C#中完美運行,只需遍歷所有外鍵並檢查哪些表具有引用相應FK的主鍵。檢測連接是否可能

但是,事情現在變得複雜了。我添加了虛擬表格的概念,形式爲View。因此,可以使用連接表創建視圖,然後可以使用同一視圖與其他表進行連接。這樣做的目的是爲了能夠簡化可能連接3個或更多表的情況。從而允許用戶以簡單的方式將3個或更多的表連接在一起,這要感謝使用視圖。

我的問題是,意見似乎不存儲概念,如主鍵和外鍵。因此,我將如何去檢測特定表和視圖之間是否可以進行連接?例如,我可以有以下幾種觀點:

CREATE VIEW [View A] 
AS 
SELECT Children.Child_ID, 
     Social_Workers.Social_ID 
FROM Children 
INNER JOIN Social_Workers 
    ON Children.Social_ID = Social_Workers.Social_ID 

接下來,我決定加入這一觀點與表像這樣:

SELECT [View A].Child_ID, 
     Sponsors.User_ID 
FROM [View A] 
INNER JOIN Sponsors 
    ON [View A].Child_ID = Sponsors.Child_ID 

我怎麼會去檢測的加盟可能性視圖和表之間?

+1

「可能」是有點誤導 - 它總是有可能加盟他們有任何列上的兩個表。 – Argeman 2013-03-07 11:35:08

+0

@Argeman - 我的意思是 - 如果在兩個表格之間檢測到關係:) – 2013-03-07 11:36:57

+0

我同意@Argeman以及更多,注意有一系列使用中的系統*(EAV任何人?)*加入但沒有外鍵。根據你的問題,我懷疑除了得到VIEW的定義並解析它之外別無他法。實質上,這也是優化器所做的,用實際的底層SQL語句替換視圖。也許如果你告訴我們你的用例,我們可以給你其他的選擇。 – 2013-03-07 11:41:41

回答

2

您有兩種方法,您可以選擇哪種方法取決於您是否想要快速解決方案,以便對DBMS進行更改或執行艱苦的工作。您的視圖


取得架構,在DBMS創建臨時表和使用您現有的邏輯

即使你不得不創建表的匹配模式的看法,我認爲這是一個快速的解決方案因爲測試的所有負擔都轉移到了SQL Server上。


兩個表到DataTable的負載模式和做測試手動

  • 檢查數量連接列的都是父母子女表
  • 檢查類型的精確匹配列在兩個表中匹配
  • 檢查每列是否只出現一次在其加入側
  • 檢查是否沒有已經是在DB具有完全相同的列關係
  • 檢查孩子列沒有唯一的(並根據您的需要非空)約束
+0

第二種方法是取代DBMS的內置關係檢查嗎?由於所有列在視圖中基本相等? – 2013-03-07 11:46:19

+0

是的,建議採用第二種方法替換DBMS的檢查。我不明白你的問題的第二部分。我提到的檢查是對身份加入的一般檢查。我假定你想忽略你的「虛擬表」實際上是視圖,並且在某些時候你會想從視圖中檢索數據到一個.NET DataTable並在它和另一個表之間創建一個DataRelation。 – 2013-03-07 18:20:32