【问题标题】:Detecting whether a join is possible or not检测是否可以加入
【发布时间】:2013-03-07 11:24:44
【问题描述】:

我正在构建一个系统,用于检测何时可以将表连接在一起。例如,在两个简单表的情况下 - 如果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

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

【问题讨论】:

  • “可能”有点误导 - 总是可以在它们拥有的任何列上连接两个表。
  • @Argeman - 我所说的可能是 - 如果在两个表之间检测到关系:)
  • 我同意@Argeman 等观点,请注意有大量系统正在使用中(EAV 有人吗?),它们已加入但没有外键。根据您的问题,我怀疑除了获取 VIEW 的定义并对其进行解析之外,别无他法。本质上,这也是优化器所做的,用实际的底层 SQL 语句替换视图。也许如果您告诉我们您的用例,我们可以为您提供其他选择。
  • @LievenKeersmaekers - 我基本上是在创建一个用于处理复杂连接的查询构建器。例如,用户理论上可以在两个表之间创建内部连接,并将结果与​​另一个表连接。理论上,整个结果可以与另一个结果连接,进而包含许多表。这是问题的主要背景,因此我选择使用视图。连接的每个结果都会变成一个视图,以使生成的 SQL 语句更易于管理。我在这个阶段尝试处理的部分是将表格加入到视图中。

标签: c# .net sql sql-server database


【解决方案1】:

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


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

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


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

  • 检查父表和子表的连接列数
  • 检查两个表中匹配列的类型是否完全匹配
  • 检查每列是否在其连接侧仅出现一次
  • 检查数据库中是否存在具有完全相同列的关系
  • 检查子列是否没有唯一(并且取决于您的需要不是空)约束

【讨论】:

  • 是否执行第二种方法来替换 DBMS 的内置关系检查?由于视图中的所有列本质上都是相等的?
  • 是的,建议使用第二种方法来替换 DBMS 的检查。我不明白你问题的第二部分。我提到的检查是身份加入的一般检查。我假设你想忽略你的“虚拟表”实际上是视图,并且在某些时候你会想要从视图中检索数据到 .NET DataTable 并在它和另一个表之间创建一个 DataRelation。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
  • 2010-11-04
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多