Как программно найти отношение «многие ко многим» в базе данных SQL Server 2005 - PullRequest
0 голосов
/ 21 января 2009

Я могу найти прямой внешний ключ таблицы в c #, например:

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

Классическое представление для отношения многие ко многим достигается через промежуточную таблицу, которая имеет отношение один ко многим с двумя основными таблицами, поэтому прямой связи между таблицами, имеющими отношение many2many, нет.

На данный момент я пытаюсь найти проверку отношения многие ко многим, если анализируемая таблица содержит только два столбца, и оба столбца являются внешними ключами для разных таблиц (в этом случае я распознаю это как промежуточную таблицу).

Это не лучшее решение, поскольку иногда промежуточная таблица содержит также другие столбцы.

Как лучше всего программно найти это множество связей?

Ответы [ 4 ]

0 голосов
/ 23 июля 2009

Если таблица имеет столбцы внешнего ключа для двух разных таблиц, то она определенно представляет отношение между многими из многих таблиц. Тот факт, что таблица имеет другие столбцы, означает, что связь между таблицами (сущностями) дополнительно уточняется дополнительными атрибутами. Посмотрите на пример на рисунке ниже:

alt text

В приведенном выше примере между продуктом и счетом существует много-много отношений. Таблица пересечений также будет иметь описательные атрибуты, такие как «количество», «подарочная упаковка» и т. Д. Это не устраняет тот факт, что в первую очередь существует отношение многих ко многим. Таблицы будут выглядеть так:

  • Продукт (prod_id, name, unitweight, uom)
  • Счет (BillNo, дата, сумма, сум)
  • BillItems (prod_Id, BillNo, количество, gift_flg)
0 голосов
/ 21 января 2009

Вы, похоже, выдвинули собственное решение. Вместо того, чтобы искать таблицы с двумя внешними ключами, ссылающимися на другие отдельные таблицы и без других столбцов, просто удалите фразу «без других столбцов».

Другими словами, ищите «таблицы, которые имеют два внешних ключа, ссылающихся на другие отдельные таблицы».

0 голосов
/ 21 января 2009

Этот оператор находит все таблицы как минимум с двумя столбцами внешнего ключа

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
0 голосов
/ 21 января 2009

В качестве дополнительных критериев вы можете использовать тот факт, что во многих случаях пара из двух внешних ключей представляет первичный ключ таблицы соединения / промежуточной таблицы.

...