2013-03-07 61 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