Предложение по типам топиков
Уважаемые разработчики есть к вам предложение по улучшению внутренней структуры ЛС
РЕчь идет о поле БД topic_type. кому интересно смотрим под кат.
Собственно суть.
Есть некоторые плагины которые добавляють другие типы топиков в ЛС, и собственно при инсталяции — меняют это поле через Alter
Тепер допустим что есть 2 таких модуля:
1 — добавляет тип event
2 — добавляет тип video
Если оставить структуру такой как сейчас то сомневаюсь что можно будет установить эти 2 плагина одновременно а если и получиться, то удалить их мы уже не сможем, так как при удалении они будут менять это поле в стандартный вид и будут затираться изминения другого модуля.
Предлагаю
Заменить тип поля на smallint
Добавить справочник типов полей:
Добавить функции конвертации
Таким образом это может облегчить расширение функциональности ЛС за счет более гибкого внедрения новых типов топиков
РЕчь идет о поле БД topic_type. кому интересно смотрим под кат.
CREATE TABLE IF NOT EXISTS `prefix_topic` (
`topic_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`blog_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
=========> `topic_type` enum('topic','link','question','photoset') NOT NULL DEFAULT 'topic',
Собственно суть.
Есть некоторые плагины которые добавляють другие типы топиков в ЛС, и собственно при инсталяции — меняют это поле через Alter
Тепер допустим что есть 2 таких модуля:
1 — добавляет тип event
2 — добавляет тип video
Если оставить структуру такой как сейчас то сомневаюсь что можно будет установить эти 2 плагина одновременно а если и получиться, то удалить их мы уже не сможем, так как при удалении они будут менять это поле в стандартный вид и будут затираться изминения другого модуля.
Предлагаю
Заменить тип поля на smallint
Добавить справочник типов полей:
+create table if not exists `prefix_topic_type` (
+ `topic_type_id` INTEGER not null auto_increment,
+ `topic_type_name` varchar(32),
+ PRIMARY KEY (`topic_type_id`)
+) engine=innoDB default charset=utf8 auto_increment=1;
Добавить функции конвертации
public function TopicTypeName2Id($oTopicName)
public function TopicTypeId2Name($oTopicId)
Таким образом это может облегчить расширение функциональности ЛС за счет более гибкого внедрения новых типов топиков
34 комментария
в движке есть механизм чтоб аккуратно этот момент обойти
www/engine/classes/Plugin.class.php(208)
/**
* Добавляет тип в поле enum
*
* @param string $sTableName
* @param string $sFieldName
* @param string $sType
*/
protected function addEnumType($sTableName,$sFieldName,$sType) {
$this->Database_addEnumType($sTableName,$sFieldName,$sType);
}
Остается открытым вопрос об удалении плагина т.к не нашел функции removeEnumType
то получаеться что удаление плагинов как минимум засорит базу.
а собственно почему вопрос то возник?
столкнулся с проблемой при разработке?!
если так, то имеет смысл продолжать искать «истину», а если о других беспокоишься или проблемы реально с плагинами, то врятли к чему приведет, по вполне понятным причинам
ЗЫ извини за оффтоп, но чо у тя за ник такой… странный? это твой номер телефона?
Список ENUM в MySQL может содержать максимум 65535 различных величин. Так что установятся без проблем и ещё вагон других.
При удалении врядли этот список меняет в исходное состояние хоть один существующий плагин, ибо незачем — ведь, если пользовались плагином, то и топики с таким типом появились. Ну а затираться само по себе ничего не будет, это же база данных, она чудес не творит.
Единственный нюанс с этим полем может возникнуть при обновлении структуры таблицы топиков, если таковая будет иметь место в будущих релизах Livestreet. Но, я думаю, ort сделает всё красиво, как всегда. Да и сами при обновлении можете код update.sql проверить.
Так что никаких проблем с текущим положением дел.
Вот напишу я плагин с типом 'foo' и приложу sql-фалик к нему:
А ты другой плагин напишешь со своим типом 'foo' и приложишь свой sql-фалик:
Надо объяснять, почему эти два плагина не будут работать одновременно без вмешательства в базу ручками?
Один пишет:
Другой:
Третий:
И никаких проблем!
Тебе кажется, что это правильным, когда меняющйся набор загоняется в ENUM, а мне (с точки зрения проектирования) — нет. И то, что часть манипуляций с базой вынесена в sql-файл, а часть прямо в код активации плагина вшита, мне тоже кажется не очень логичным. Я понимаю, что иногда может быть довольно сложная логика, которую проще в PHP обернуть, нежели в sql-коде выполнять, но добавление типа — это немного не тот случай.
Все это ИМХО, разумеется. Хоть я и знаю, что оно не совпадает с ИМХОй разработчика.
Если меняем один модуль на другой, в БД ничего менять не нужно. Вы же меняете логику работы, зачем же менять «event» на «event» в базе? :)
От этой маловероятной ситуации не спасёт отдельная таблица для типов топиков.
Понимаешь, я ведь не просто теоретически рассуждаю, я с этим гемором на практике столкнулся. Поэтому я считаю, что тип топика и тип блога — это должна быть такая сущность, обладающая набором свойств, которые можно расширять (а не как сейчас, все свойства — это название типа). Такой подход мне кажется более грамотным и более гибким.
Ну вот, например, что нужно от типа, кроме него самого, какие свойства?
Да собственно и сейчас — просто топик и опрос это разные типы. Почему? По сути опрос — это тот же топик (один в один!), только с дополнительными свойствами.
Но еще больше проблем возникает, когда с типами блогов начинаешь работать. Вот конкретный пример из движка:
Т.е. в коде жестко задается перечень типов блога. А теперь прикинь — если я ввожу свой тип, то мало того, что мне всю функцию надо перекрывать только ради того, чтоб массив переписать, так еще если я ставлю чужой плагин, где еще тип блога вводится, то я должен ручками править эту строку, всего лишь чтоб перечислить все возможные типы блогов, которые может создать юзер. И если я добавляю новый плагин или отключаю старый, где определяется свой тип, я должен искать в коде, где там явно в массивах перечисляются типы и руками их править. Нормально?
этот пример не показывает минусу enuma'а, он показывает косяки в коде еще со времен версии 0.1, когда и не предполагалось наличие модификаций, плагинов и т.п. Здесь так же можно хранить в классе набор доступных типов, а плагинами его дополнять/изменять.
Действительно большой минус enum — это долгое выполнение alter на большой таблце
нехилый холивор у Вас получился.
Может я действительно поторопиля с этими табицами, может стоит начать с изминения типа topic_type на varchar уже бы подало разработчикам