Ответ 1
Самая большая проблема с реализацией PostgreSQL INHERITS
заключается в том, что вы не можете установить ссылку на внешний ключ для родительской таблицы. Есть много случаев, когда вам нужно это делать. См. Примеры в конце моего ответа.
Решение о создании таблиц, представлений или триггеров за пределами Rails является решающим. Как только вы решите это сделать, я думаю, вы можете использовать самую лучшую структуру, которую вы можете найти.
Я долго использовал базовую родительскую таблицу, применяя непересекающиеся подтипы с использованием внешних ключей. Эта структура гарантирует существование только одной ассоциации и что ассоциация разрешает правильный подтип в родительской таблице. (В Билл Карвин демонстрирует слайд-шоу на антипаттернах SQL, этот подход начинается с слайда 46.) Это не требует триггеров в простых случаях, но я обычно предоставляют одно обновляемое представление для каждого подтипа и требуют, чтобы клиентский код использовал представления. В PostgreSQL обновляемые представления требуют записи триггеров или правил. (Версии до 9.1 требуют правил.)
В наиболее общем случае непересекающиеся подтипы не имеют одинакового числа или вида атрибутов. Вот почему мне нравятся обновляемые представления.
Наследование таблиц не переносимо, но такая структура. Вы даже можете реализовать его в MySQL. В MySQL вам нужно заменить ограничения CHECK ссылками на внешние ключи для таблиц с одной строкой. (MySQL анализирует и игнорирует ограничения CHECK.)
Я не думаю, что вам нужно беспокоиться о дублировании данных. Во-первых, я уверен, что данные не дублируются между родительскими таблицами и наследующими таблицами. Это просто так. Во-вторых, дублирование или полученные данные, целостность которых полностью контролируется dbms, не являются особенно горькой пилюлькой для глотания. (Но неконтролируемое дублирование.)
Подумайте, следует ли каскад удалять.
- A пример публикации с кодом SQL.
- A сторон с кодом SQL.