в чем разница между созданием другой таблицы и использованием массивов в postgres - PullRequest
2 голосов
/ 05 марта 2019

В моем университете мне было дано задание создать простую университетскую базу данных с несколькими таблицами, такими как студент, кафедры и т. Д. Был интересный момент, когда я установил отношения между студентами и классами, один студент мог выбрать несколько классов, янаучили создавать третью таблицу с двумя FK, и она должна выглядеть так: Адам (id - 1) проходит курс математики (id - 5), а в третьей таблице запись будет (1, 5), а здесьвопрос, почему мы должны предпочесть третью таблицу вместо массивов, для меня выглядит намного проще держать ученические классы в качестве дополнительного столбца в ученической таблице.Вот пример, представьте ученический стол (id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7]).

PS Это не моя домашняя работа, я ее уже сделал, но она мне действительно интересна

1 Ответ

4 голосов
/ 05 марта 2019

С теоретической точки зрения проблема заключается в том, что такой дизайн нарушает первую нормальную форму. Это имеет практические последствия:

  • Как прокомментировал a_horse_without_name, проблема номер один в том, что вы не можете иметь ограничения внешнего ключа для элементов массива.

  • Индексирование для быстрого поиска работает только ограниченным образом с использованием индексов GIN и оператора @>. Поиск с LIKE или > не может быть оптимизирован.

  • Поиск всех учащихся по классу будет менее эффективным, даже с индексом GIN, а запрос будет более сложным и менее интуитивным.

  • Если вы хотите удалить класс для ученика, вам придется переписать весь массив. Возможно, это не большая проблема, но с более длинными массивами это может повредить.

Использование таблицы сопоставления - это просто естественный способ сделать это в реляционной базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...