Pull to refresh

Comments 24

Да никаких подводных камней. Просто ActiveRecord унифицированная модель для нескольких БД. И не везде есть ENUM.

Конечно же, надо каждую табличку после стандартных миграций допиливать — добавлять индексы, внешние ключи, менять типы. Та же ситуация не только с полиморфными связями, но и с STI
Согласен, видимо поэтому в типовых примерах указывают

t.string :resource_type
t.integer :resource_id
Если бы вы добавили краткую аннотацию, что такое полиморфные связи, зачем они нужны и в чём преимущество их использования, мне кажется статья стала бы полнее и полезнее.
В самом деле. Добавлю.
у меня сейчас в черновиках валяется статья, уже пару дней тружусь, именно про то, что такое полиморфные ассоциации и как их использовать. Поначалу даже подумал, что это моя статья каким-то образом появилась в общей ленте:) Знатно испугался, знаете ли:)
Ну я же не телепат :) С удовольствием почитаю вашу статью.
Я опять за нее взялся, думаю выложить в понедельник, а то RoR-статьи не особо пользуются спросом, в выходной быстро вниз уйдет :(
Да не, вроде нормально. Ну можно еще в гуглгруппе написать пост, основное же сообщество там.
было бы кого там этому учить:)
Ну в группе очень много человек, просто не каждый там себя проявляет. В любом случае спросить мнения стоит.
Более наглядно результаты выглядили бы на графике
К сожалению нет. Данные формировались псевдослучайно, и видно что разброс не велик, поэтому я и решил взять матожидание и не строить график. Ниже в комментариях я привел ссылку на скрипт генерации данных.
UFO just landed and posted this here
это не так :) просто не все тут.
А кто прокомментирует момент с изменением ENUM на большом количестве данных?
Спасибо за тесты.
Поясните пожалуйста детальнее. Не совсем понятно что вы подразумеваете под изменением ENUM и о каком количестве данных идет речь?
Изменение схемы имеется ввиду, когда добавляется новое значение в ENUM, например.
Попытаюсь получить точные цифры. Если на глаз, то порядка 10 минут на 1000000 записей.
Причем мой MySQL идет со стандартным конфигом, и компьютер у меня не то что бы очень.
Обещанные данные:
1. ENUM -> VARCHAR — 1053.34708200 секунд
2. VARCHAR -> ENUM('Post','Image') — 535.87988500 секунд
3. ENUM('Post','Image') -> Enum('Post','Image','Something') — 826.80801800 секунд

на 1000000 записей.
а ENUM('Post','Image','Reserved1','Reserved2') -> ENUM('Post','Image','Something','Reserved2') — сколько секунд?

осмелюсь предположить что где-то около 0.2с :)
Что-то неоднозначные соотношения в результирующей таблице наводят на мысли о неодинаковости наборов исходных данных. Надо было одним скриптом оба варианта заполнять, чтобы все посты в обоих случаях имели одни и те же комментарии.

P.S. В независимости от того какой вариант быстрее в реальности, нет смысла вводить ENUM пока в результате профайлинга реального приложения не доказано, что использование VARCHAR является узким местом в производительности.
Ибо преждевременная оптимизация — одно из самых больших зол в программировании.
Данные одинаковы в обоих таблицах. В подтверждение вот скрипт генерации gist.github.com/264003

Насчет преждевременной оптимизации, как мне кажется, речи не идет. Скорее тут вопрос проектирования БД. Разумеется можно оставлять VARCHAR, и потом по необходимости менять. Зависит от проекта и лично опыта.
Если я не ошибаюсь, то, что вы описываете в качестве альтернативы — это STI(Single Table Inheritance). Вообще вот здесь написано, что стоит использовать их не стоит, т.к. «модели будут связаны намертво» и потом их фиг отдерёшь друг от друга. Но вообще STI — иногда очень удобная штука, поэтому в каждом случае нужно решать отдельно, что вы будете использовать.
Sign up to leave a comment.

Articles

Change theme settings