2015-04-16 8 views
4

фонсхема миграции: один-ко-многим, многие-ко-многим в PostgreSQL

В MySQL, мне нужно моделировать один-ко-многим с два таблиц и многие-ко-многим с три таблицы, если я хочу сохранить нормализованные таблицы.

Я расследую миграции на PostgreSQL, который, что удивительно, позволяет вектор и даже многомерного вектора полей!

Вопросы

Каковы канонических отображения для один-ко-многим и многие-ко-многим в PostgreSQL?

  • ли таблицаодин-ко-многим просто один с вектором поле?

  • Есть ли путаница для модели много-ко многим или это зависит от ситуации (например, как мне нужно запросить)?

  • Есть ли предостережений для использования в поле массива?

+0

В общем случае вам не нужно использовать 'array' просто из-за отношения x-to-many, хотя '' '' '' '' конечно можно использовать разными способами. Обычно они просто соединяют их через отношения * Foreign Key *. Есть ли причина, почему это не будет работать в вашем случае? – khampson

+0

Демонстрационная реализация модели «многие-ко-многим»: http://stackoverflow.com/questions/9789736/how-to-implement-a-many-to-many-relationship-in-postgresql/9790225#9790225 –

ответ

13

В PostgreSQL вы должны придерживаться реляционного моделирования, как и в настоящее время в MySQL.

массивов PostgreSQL являются полезными, но не должны быть вашим первым выбором для моделирования данных по многим причинам:

  • грубой выборки, блокировка и записи детализации для массивов;
  • Недостаточная поддержка целевых мишеней (правда, по крайней мере, 9,4; 9,5, возможно, добавили поддержку массива FK, но она была отключена из-за проблем с производительностью);
  • ограниченная поддержки в клиентских библиотеках и приложениях

Следует отметить, что при обновлении массива, то необходимо обновить массив всего, переписывания всего массива. Обновления на месте не могут быть выполнены из-за MVCC.

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

Канонические отображения один-ко-многим и многие-ко-многим в PostgreSQL точно так же, как и в любой реляционной базе данных:

1: м

CREATE TABLE parent (
    parent_id integer primary key, 
    ... 
); 

CREATE TABLE child (
    child_id integer primary key, 
    parent_id integer not null references parent(parent_id), 
    ... 
); 

м: п:

CREATE TABLE m(
    m_id integer primary key, 
    ... 
); 

CREATE TABLE n(
    n_id integer primary key, 
    ... 
); 

CREATE TABLE m_n (
    m_id integer references m(m_id), 
    n_id integer references n(n_id), 
    PRIMARY KEY(m_id, n_id), 
    ... 
); 
Смежные вопросы