Соединительные таблицы против массивов внешних ключей?
Я моделирую отношения "многие ко многим", когда к отношениям обращаются большую часть времени только с одной стороны. Это больше похоже на иерархию, доступ к которой осуществляется сверху вниз, а не наоборот.
Опрос имеет и принадлежит многим Вопросам, имеет и принадлежит многим Ответам.
Обе взаимосвязи должны быть "многие ко многим", потому что один и тот же вопрос можно повторно использовать в разных опросах и один и тот же ответ во многих вопросах. Это требование.
Стандартная реализация M2M будет использовать две соединительные таблицы, surveys_questions
а также questions_answers
, Вместо этого я думаю об использовании целочисленных массивов PostgreSQL для хранения question_ids
в опросе и answer_ids
обсуждаемый.
Мы можем использовать ЛЮБОЙ оператор для запроса всех строк, соответствующих массиву внешнего ключа.
Как мы будем запрашивать все опросы с их вопросами и ответами на вопросы с использованием SQL?
Как мы можем сопоставить порядок строк, возвращаемых с массивом внешнего ключа? то есть. использование question_ids = [1,2,3] гарантированно возвращает строки вопросов с порядком 1, 2, 3.
Как это влияет на производительность по сравнению с соединительными таблицами (при условии правильных индексов, какими бы они ни были)?
Вы бы предложили это? Есть ли какие-то ресурсы о моделировании M2M, как это?
Обновить
Было предложение добавить ссылочную целостность для внешних ключей массива в PostgreSQL 9.3, но оно не было включено: http://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/
Так что вопрос о поддержании порядка с использованием массива внешнего ключа PostgreSQL JOIN с типом массива с порядком элементов массива, как реализовать?
1 ответ
Используйте подход к соединительной таблице. Метод массива является достаточно нестандартным, поэтому вам нужно задавать вопросы о том, сколько он будет работать, тогда как другой является полностью стандартным.