Плюсы и минусы наследования одной таблицы для активов в Rails

Я смотрю на драгоценные камни для загрузки файлов, и, похоже, существует тенденция помещать все активы в одну таблицу «Активы» и использовать STI для их подкласса. Например, ImageAsset, VideoAsset, AudioAsset и т. д.

Я новичок в Rails и никогда не использовал STI. Раньше я бы просто сделал images, videos, audios отдельные таблицы. Конечно, они могут иметь несколько общих столбцов, но я бы сказал, что у них также будут несколько разных (частота дискретизации не применяется, например, к изображению).

Плюсы запихивания всего этого в одну таблицу «ассеты»: проще выполнять запросы по всем ассетам. Минусы: стол быстрее разрастается. Думаю, я всегда мог бы разбить столбец «тип», если это проблема. Также я ожидаю, что все столбцы только для аудио будут нулевыми в строках изображений и т. д.

Все мое приложение будет основано на активах, поэтому я хочу убедиться, что у меня есть плюсы и минусы, прежде чем принимать решение. Кто-нибудь делал активы STI и сожалел об этом? Кто-нибудь так делал и не пожалел (на большую сумму активов)? Будет ли CTI (наследование таблиц классов) лучшим решением?




Ответы (1)


Я бы сказал, что одним из самых больших минусов использования STI является то, что если вы когда-нибудь добавите в таблицу столбец, который не является общим (и что это означает одно и то же) между ВСЕМИ моделями STI, то вы просто взорвали целостность ваших данных прямо здесь.

Пустые поля в (реляционных) базах данных обычно создают больше проблем, чем решают.

Я был укушен этим пару раз, и это особенно расстраивает, когда классы в вашем отношении STI начинают иметь собственные подклассы, которые, в свою очередь, добавляют еще больше столбцов в таблицу.

Я бы сказал, что если вы хотите сделать эту структуру как можно лучше, я действительно думаю, что CTI - гораздо лучшая альтернатива, даже несмотря на то, что заставить ее работать с рельсами может быть немного сложно. По крайней мере, это намного сложнее, чем STI.

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

Можно также утверждать, что STI «хорошо» подходит для быстрого прототипирования, и если вы просто хотите собрать что-то быстро, просто чтобы посмотреть, работает ли оно вообще, вы можете использовать STI, но как только вы начинаете добавлять столбцы, которые не имеют смысла для всех моделей в отношении, вам, вероятно, следует преобразовать их в CTI или что-то еще.

person Frost    schedule 16.01.2012
comment
Проблема в том, что прототипы имеют раздражающую привычку превращаться в настоящие критически важные приложения без рекомендуемой реархитектуры и тому подобного. Я склонен думать, что ИППП почти всегда является ошибкой, не стоит строить свой фундамент на песке. - person mu is too short; 16.01.2012
comment
@muistooshort Я знаю эту историю! С точки зрения логистики это может быть сложным изменением на оживленном сайте с большими столами. В противном случае STI => CTI кажется довольно прямым изменением? Я склоняюсь к использованию STI, потому что, похоже, нет хорошего сильного решения CTI. Кроме того, мои запросы в основном относятся к базовому классу, специализируясь только на рендеринге представлений (например, используйте <video>, когда тип == видео, <img>, когда тип == изображение и т. д.). Думаю, это не слишком отличается от сообщений Tumblr. Кроме того, я хочу хранить определяемые пользователем заказы (думаю, с сортировкой jQuery), что, я думаю, может быть проще с STI? - person aspect; 16.01.2012
comment
Хотя скажу. ИППП до сих пор беспокоит меня. Если бы это не были постоянные объекты, я бы избегал наследования. Я бы просто реализовал общий интерфейс. Например, все они могут ответить _на #url. И, чтобы справиться с отсортированной вручную коллекцией смешанных типов активов, нет проблем, это будет просто вопрос массива в Ruby. - person aspect; 17.01.2012
comment
Мартин, чтобы избежать проблем со столбцами NULL, что вы думаете о STI со столбцом hstore PostgreSQL для атрибутов подкласса? Это не подходит для каждого случая, но я думаю, что это может быть хорошо для меня. Если вы не знакомы с hstore, это тип столбца хэш-карты/ключ-значение, который вы можете индексировать и запрашивать. Я считаю, что Rails даже десериализует столбцы hstore. - person aspect; 17.01.2012
comment
@aspect Это звучит немного лучше, но я бы все равно просто избегал ЗППП. Это может быть потому, что я почувствовал боль, которую это может вызвать (и мой босс в то время сказал мне, что у нас нет времени на рефакторинг должным образом). Как сказано слишком кратко, прототипы имеют тенденцию становиться критически важными для миссии, а это плохо. Когда они содержат ИППП, они, как правило, просто бомбы, ожидающие взрыва. - person Frost; 17.01.2012
comment
Я помню mediumexposure.com/multiple-table-inheritance-active-record быть очень интересным, когда я читаю это, в то время как мы на предмете. - person Frost; 17.01.2012
comment
Вы бы по-прежнему избегали STI, если основными запросами являются: Получить все активы для пользователя: select * from assets where user_id = x; и Получить расположение активов вручную: select a.* from arrangements s join assets a on s.asset_id = a.id where s.id = ? order by s.position asc;? Кажется, что разбиение на отдельные таблицы усложнило бы эти запросы. Думаю, я мог бы ОБЪЕДИНИТЬ их в представление SQL, похожее на таблицу STI, а затем заставить таблицу договоренностей использовать полиморфную ассоциацию arrangeable_id, arrangeable_type вместо asset_id? Так ли это и лучше ли это, чем ИППП? - person aspect; 17.01.2012
comment
Это кажется немного утомительным, но я все же постараюсь избежать ИППП. Я бы в основном задал себе этот вопрос: имеют ли они одну и ту же модель данных и настолько ли они связаны? Если да, то я могу рассмотреть использование STI. В противном случае, нет, я бы избегал этого, как чумы. - person Frost; 17.01.2012
comment
большое спасибо обоим за ваш вклад - person aspect; 17.01.2012