【问题标题】:How to programmatically find a many to many relation in an SQL Server 2005 database如何以编程方式在 SQL Server 2005 数据库中查找多对多关系
【发布时间】:2010-10-02 15:56:15
【问题描述】:

我可以在 c# 中找到直接表外键,例如:

  foreach (ForeignKey key in CurrentTable.ForeignKeys) {
                    Console.WriteLine("FK:" + key.ReferencedTable);
          }

多对多关系的经典表示是通过与两个主表具有一对多关系的中间表实现的,因此具有多对多关系的表之间没有直接链接。

目前,我尝试查找多对多关系,检查我正在分析的表是否只有两列并且两列都是不同表的外键(在这种情况下,我将其识别为中间表)。

这不是最佳解决方案,因为有时中间表还包含其他列。

以编程方式找到这种 many2many 关系的最佳方法是什么?

【问题讨论】:

    标签: c# sql-server sql-server-2005 code-generation metadata


    【解决方案1】:

    作为附加标准,您可以使用以下事实:在许多情况下,两个外键的对代表连接/中间表的主键。

    【讨论】:

      【解决方案2】:

      您似乎已经提出了自己的解决方案。不要搜索具有两个外键引用其他不同表且没有其他列的表,只需删除短语“and with no other columns”即可。

      换句话说,寻找“有两个外键引用其他不同表的表”。

      【讨论】:

        【解决方案3】:

        此语句查找所有具有至少两个外键列的表

        SELECT  objects_1.name AS Master1, objects_2.name AS Master2, sys.objects.name AS Detail, 
            sys.columns.name AS Column1, columns_1.name AS Column2
        FROM sys.objects 
        INNER JOIN sys.columns ON sys.objects.object_id = sys.columns.object_id 
        INNER JOIN sys.foreign_key_columns ON sys.columns.column_id = sys.foreign_key_columns.parent_column_id 
            AND sys.columns.object_id = sys.foreign_key_columns.parent_object_id 
        INNER JOIN sys.objects AS objects_1 ON sys.foreign_key_columns.referenced_object_id = objects_1.object_id 
        INNER JOIN sys.columns AS columns_1 ON sys.objects.object_id = columns_1.object_id 
            AND columns_1.column_id <> sys.columns.column_id 
        INNER JOIN sys.foreign_key_columns AS foreign_key_columns_1 ON columns_1.object_id = foreign_key_columns_1.parent_object_id 
            AND columns_1.column_id = foreign_key_columns_1.parent_column_id 
        INNER JOIN sys.objects AS objects_2 ON objects_2.object_id = foreign_key_columns_1.referenced_object_id
        WHERE     (sys.columns.is_nullable = 0) AND (columns_1.is_nullable = 0)
        ORDER BY Master1, Detail, Master2
        

        【讨论】:

        • 为什么这被否决了?诚然,这是一段难看的代码,但最复杂的 SQL 是 :-)。不过,如果它解决了问题,它应该被投赞成票。我讨厌开车投反对票!!
        • 谢谢。我花了一些时间来组装查询,但我只是对解决难题感兴趣;)
        【解决方案4】:

        如果一个表有两个不同表的外键列,那么它肯定代表了表之间的多对多关系。表具有其他列的事实仅意味着表(实体)之间的关系由额外属性进一步限定。看看下图中的例子:

        在上面的示例中,产品和账单之间存在多对多关系。交集表还将具有描述性属性,如“数量”、“礼品包装”等。这并不能消除首先存在多对多关系的事实。表格看起来像这样

        • 产品(prod_id, name, unitweight, uom)
        • Bill(BillNo, date, amount,uom)
        • BillItems(prod_Id, BillNo,quantity,gift_flg)

        【讨论】:

          猜你喜欢
          • 2010-10-11
          • 1970-01-01
          • 2011-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-14
          • 2012-04-26
          • 1970-01-01
          相关资源
          最近更新 更多