0

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

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

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

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

这不是最好的解决方案,因为有时中间表还带有其他列。

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

4

4 回答 4

0

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

于 2009-01-21T11:03:20.513 回答
0

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

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

于 2009-01-21T11:04:20.057 回答
0

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

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
于 2009-01-21T11:46:07.743 回答
0

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

替代文字

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

  • 产品(prod_id,名称,单位重量,单位)
  • Bill(BillNo, date, amount,uom)
  • BillItems(prod_Id,BillNo,数量,gift_flg)
于 2009-07-23T03:55:36.447 回答