Как определить кардинальность внешнего ключа с помощью mysql

Я застрял в проблеме, когда мне нужно найти кардинальность отношения между таблицами, используя mysql. После этого сообщения
MySQL: как программно определить отношения внешнего ключа ?
Я нашел все таблицы, связанные с моей таблицей, и столбцы с внешним ключом. Теперь я также хочу найти мощность отношения, то есть один к одному, один ко многим или многие ко многим. Любые идеи или фрагменты будут высоко оценены


person Code Prank    schedule 27.09.2012    source источник
comment
Вам действительно нужно рассчитать текущую кардинальность с помощью связанных таблиц? Кардинальность - это не возможные значения, а текущие данные. Итак, запрос должен быть: count(distinct values in column)/count(rows in table)   -  person ravnur    schedule 27.09.2012
comment
я просто хочу выяснить, является ли отношение один к одному, один ко многим или многие ко многим между таблицами   -  person Code Prank    schedule 27.09.2012
comment
Если вы не найдете дубликатов в дочерней таблице, это не означает, что соотношение 1:1. То же самое с 1:N, M:N. Другими словами, вы не можете быть уверены в типе отношения, полагаясь только на обнаружение дубликатов в дочерних/родительских таблицах. Вы можете найти только отношение M:N, и это будет правильно. Другие ответы могут быть такими: может быть, это 1: 1 или 1: N.   -  person ravnur    schedule 27.09.2012
comment
да, но я думаю, что должен быть какой-то способ узнать это. Если вы использовали yii framework, его тип отношений типа HAS_MANY, MANY_MANY, HAS_ONE и т. д. строится генератором crud, это означает, что есть какой-то способ выяснить это.   -  person Code Prank    schedule 27.09.2012
comment
Извините, я не знаком с этим фреймворком. Вот псевдокод, который может помочь вам найти тип отношения на основе данных. Но помните об эскалации типа отношений. Вот ссылка: gist.github.com/3793455. Просто руководство   -  person ravnur    schedule 27.09.2012
comment
да, я понял, как он узнал, но это не помогло бы, если у кого-то есть свежая база данных, что означает отсутствие данных, тогда это не сработает.   -  person Code Prank    schedule 27.09.2012


Ответы (1)


Предположим, что таблица A имеет внешний ключ f, который ссылается на первичный ключ k таблицы B. Затем из схемы можно узнать следующее:

  • Если есть ограничение UNIQUE для A.f, то может быть не более одной строки в A для каждой строки в B. Обратите внимание, что в случае индексов с несколькими столбцами все столбцы ограничения уникальности должны быть частью внешнего ключа. Вы можете использовать SHOW INDEX FROM tablename WHERE Non_unique = 0 для получения информации об ограничениях уникальности таблицы.
  • Если A.f объявлен как NOT NULL, то всегда будет по крайней мере одна строка в B для каждой строки в A. Вы можете использовать SHOW COLUMNS FROM tablename, чтобы вывести список столбцов и посмотреть, какие из них допускают значения NULL.

Если вы интерпретируете «один» как «ноль или один», вы получаете отношение один-к-одному с использованием уникального ограничения и отношение многие-к-одному (т.е. многие строки в A ссылаются на одну строку в B) без такого уникального ограничения.

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

person MvG    schedule 27.09.2012