Наследование PostgreSQL в ActiveRecord?

Итак, все мы знаем, что STI (наследование одиночной таблицы) rails является icky, потому что это приводит к загроможденной модели данных и субоптимальной базе данных.

Однако PostgreSQL, похоже, прекрасно справляется с наследованием!

Есть ли способ получить чистый чистый STI API рельсов, используя наследование Postgres вместо больно широких таблиц и столбцов типа?

Ответ 1

Вкратце - нет никакого чистого чистого STI API для того, чего вы пытаетесь выполнить на данный момент.

Я действительно заглянул в это примерно год назад и пришел к выводу, что это не очень хорошая идея по нескольким причинам:

  • Если вы хотите использовать специальные функции PostgreSQL, вы в основном вступаете в брак с этой БД. Не поймите меня неправильно. PostgreSQL - отличная БД, и я использовал ее в ряде случаев, но вы собираетесь придерживаться этого проекта БД и приложений.
  • Скорее всего, если вы начнете использовать конкретные функции БД, вы либо закончите их реализацию вручную (запустив какие-то команды в БД, либо используя графический интерфейс), либо напишите какой-то script, который вам придется вызывать всякий раз, когда вы работают db: migrate (вам нужно будет сделать это, если вы хотите провести надлежащее тестирование). Через некоторое время это становится громоздким и раздражающим.
  • Если вы обнаружите, что вас все больше раздражает, процитируйте "больно широкие таблицы и" введите "столбцы, а затем:
    • Ваш дизайн стола необходимо пересмотреть и переделать.
    • Ваши модели не могут быть хорошими кандидатами для STI
    • Вам просто нужно жить с этим.

Большинство ИТ-проблем действительно сводятся к следующему: Усилия против выгоды.

В вашем случае вы должны задать себе этот вопрос:

  • Сколько времени вы хотите потратить на внедрение лучшей ИППП если он только ускорит ваш необработанный SQL-запрос на несколько секунд? Может быть, лучше написать более эксплицирующий SQL-запрос? Большинство приложений не растут до размера, где это действительно становится проблемой. Но это может быть и другое в вашем случае.

P.S:.

Также вы найдете краткое описание структурирования STI в своем приложении: если вы обнаружите, что у вас есть много моделей, которые используют STI, например, ProductCategory, CommentCategory, PhoneCategory, ClientCategory, которые все наследуют от Cateogory - я, как правило, организую их в папках внутри модель. Затем в application.rb просто добавьте строку: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]

Ответ 2

Однако PostgreSQL, похоже, прекрасно справляется с наследованием!

Действительно? Вы внимательно изучили малый шрифт в руководстве? Например:

  • Уникальные ограничения (и, следовательно, первичные ключи) невозможны по уровням наследования.
  • Ссылки на унаследованные таблицы и базовую таблицу не смешиваются. То есть (взято примерно из руководства): capitals extends cities. Ваша таблица address должна ссылаться на cities. Оно может. Но нельзя использовать адрес с capital.

Эти две вещи очень важны во всем, кроме небольшого проекта Hello World. Поэтому я не могу себе представить, что что-то продуктивное может быть реализовано с использованием наследования PostgreSQL.