Плюсы и минусы наследования единой таблицы для активов в Rails
Я смотрю на гемы загрузки файлов, и, кажется, существует тенденция поместить все активы в одну таблицу "Активы" и использовать STI для их подкласса. подобно ImageAsset
, VideoAsset
, AudioAsset
, так далее.
Я новичок в Rails и никогда не использовал STI. Ранее я бы только сделал images
, videos
, audios
отдельные таблицы. Конечно, они могут иметь несколько столбцов, но я бы сказал, что они также будут иметь несколько разных столбцов (например, частота дискретизации не относится к изображению).
Плюсы в том, чтобы складывать все это в одну таблицу "активов": проще выполнять запросы ко всем ресурсам. Минусы: стол станет больше быстрее. Я думаю, что я всегда мог осколок столбца "type", если это проблема. Также я ожидаю, что все столбцы только для аудио будут нулевыми в строках изображения и т. Д.
Все мое приложение будет основано на активах, поэтому я хочу убедиться, что у меня есть плюсы и минусы прямо перед принятием решения. Кто-нибудь делал активы ИППП и сожалел об этом? Кто-нибудь сделал это и не пожалел об этом (за большое количество активов)? Будет ли CTI (наследование таблиц классов) лучшим решением здесь?
1 ответ
Я бы сказал, что одним из самых больших минусов использования STI является то, что если вы когда-нибудь добавите в таблицу столбец, который не является общим (и что это означает одно и то же) между ВСЕМИ моделями STI, то вы просто взорвались Ваша целостность данных прямо там.
Нулевые поля в (реляционных) базах данных обычно вызывают больше проблем, чем решают.
Я был укушен этим пару раз, и это особенно расстраивает, когда у классов в вашем отношении к STI появляются собственные подклассы, которые, в свою очередь, добавляют еще больше столбцов в таблицу.
Я бы сказал, что если вы хотите сделать эту структуру максимально качественной, я действительно считаю, что CTI - гораздо лучшая альтернатива, хотя может быть немного сложно заставить ее работать с рельсами. По крайней мере, это намного сложнее, чем ИППП.
В довершение всего я могу просто подумать об одном сценарии, в котором STI может быть разумным, и именно тогда вы имеете дело с моделями транзакций (например, с депозитами и снятием средств с банковского счета или около того). В этих случаях обе модели по сути одинаковы, кроме "направления" транзакции.
Можно также утверждать, что STI "хорош" для быстрого создания прототипов, и если вы просто хотите быстро что-то собрать, просто чтобы посмотреть, работает ли это вообще, вы можете использовать STI, но как только вы начнете добавлять столбцы, которые не ' Не имеет смысла для всех моделей в отношении, вы, вероятно, должны реорганизовать его в CTI или что-то еще.