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

我将如何检测视图和表之间连接的可能性?

4

1 回答 1

2

您有两种方法,您选择哪种方法取决于您是想要快速解决方案来更改 DBMS,还是进行艰苦的工作。


获取您的视图架构,在 DBMS 中创建一个临时表并使用您现有的逻辑

即使您必须创建表以匹配视图架构,我认为这是一个快速的解决方案,因为所有测试负担都转移到了 SQL Server。


将两个表的模式加载到 DataTable 并手动进行测试

  • 检查连接列的数量是否同时用于父表和子表
  • 检查两个表中匹配列的类型是否完全匹配
  • 检查每列是否仅在其连接侧出现一次
  • 检查数据库中是否存在具有完全相同列的关系
  • 检查子列是否没有唯一(并且取决于您需要非空)约束
于 2013-03-07T11:40:02.563 回答