2012-04-08 2 views
10

Итак, мы все знаем, что RTI-рельсы (однонаправленное табличное наследование) является icky, потому что это приводит к загроможденной модели данных и субоптимальной базе данных.Наследование PostgreSQL в ActiveRecord?

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

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

+1

«Значит, мы все знаем, что STI (однонаправленное наследование) является риторическим, потому что это приводит к загроможденной модели данных и субоптимальной базе данных». --- Я не принимаю это предположение. –

+0

Хорошо, может быть, это немного обобщение. Но это, как правило, хорошая идея, когда у ваших моделей-мам нет большого количества свойств, которые не относятся к другим детям. В противном случае вы получите широкие широкие таблицы столбцы с нулевым значением. Может быть, все в порядке с точки зрения рельсов, но может получить отвратительный при запуске сырой SQL в базе данных, возможно, наследование PostgreSQL не будет быстрее, но, по крайней мере, оно скрывает все это от меня! : P –

+0

Поскольку наследование Postgres накладывается так легко, я не думаю, что просто наличие столбца типа будет достаточно хорошим? Из того, что я видел с наследованием, 'SELECT *' будет возвращать все связанные столбцы (и, я думаю, все непривязанные столбцы тоже:/... Но ваша структура БД была бы чище. – stuartc

ответ

3

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

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

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

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

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

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

PS:

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

+1

Когда вы когда-либо были в курсе из вашей карьеры двигатели для производства баз данных?: P Я говорю о компаниях большого мальчика, а не о вашем «запуске», который вы начали с ваших друзей HS, и вы являетесь генеральным директором, и она является техническим директором. – Volte

+0

вроде обычно, вы не переключаете производственную реализацию так сильно, если только вам не нужно. Twitter & Facbook - яркие примеры, которые приходят на ум. Ты перешел на новую установку в течение некоторого времени. - это случилось со мной несколько раз. Мне пришлось перенести внутренние приложения из старых устаревших настроек. – konung

+0

@bwicklund - вопрос был о PostgreSQL и STI в ActiveRecord (Rails), и если есть NICE CLEAN, чтобы справиться с этим, - и ответ заключался в том, что не было никакого чистого способа управления STI, кроме как в простых случаях, и я объяснил, почему. Просто потому, что вам не нравится ответ, это не значит, что это неправильно. Если у вас есть лучшее объяснение, не стесняйтесь предоставлять свой собственный ответ. – konung

6

Однако PostgreSQL кажется обрабатывать наследование довольно красиво!

Действительно?Вы внимательно посмотрели на small print in the manual? Например:

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

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

+1

На самом деле, насколько я понимаю, это очень полезно для табличного ошпаривания. Но это правда, что он не подходит для наследования модельного пространства, как сейчас. – Divide

+0

В этом случае даже в этом случае невозможно оштукатуть стол: если у вас есть несколько уникальных ограничений, вы завинчиваетесь. И поскольку большинство фреймворков используют суррогатный ключ, это означает, что у вас даже не может быть одного уникального ограничения для данных приложения. –

+0

Конечно, если вы используете суррогатные ключи, то осколки часто становятся сложнее. В документах Psql есть хороший пример очертания: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html – Divide