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