Yii Framework Forum: Вопрос По Улучшайзингу - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Вопрос По Улучшайзингу Rate Topic: -----

#1 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 10:16 AM

у меня есть таблица Stream, которая в себе агрегирует посты с соц. сетей.
Есть так же свои собственные сущности типа новости/аудио/видео/фото постов
которые представлены в виде отдельных таблиц, но с небольшой денормализирующей линковокой в таблице Stream
в каждой из этих таблиц есть поле статуса (показывать или не показывать пост)
вот возникла задача синхронизировать статус поста. Те если выключат пост в Stream, то зеркально надо выключить и прилинкованный пост в новости/аудио/видео/фото. Так же и надо изменить состояние в таблице Stream, если изменилось состояние в какой-то связанной таблице.
делать изменение статуса всех связанных таблиц в одной модели мне кажется не верным и совершенно кривым.
делать это путем выполнения в контролере серии методов из моделей вроде как лучше, но все равно мне это решение не нравится
в каком-то контролере можно упустить обновление в какой-нибудь модели.

в общем прошу совета как лучше и правильней организовать обновление статуса в нескольких таблицах

P.S.: всплывает идея использовать события, но я как-то не очень вкурил как они в Yii работают.

Спасибо
0

#2 User is offline   Artur Zhdanov 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 112
  • Joined: 12-May 13
  • Location:Russia

Posted 16 August 2013 - 10:19 AM

Триггером в БД.
В коде держать такие вещи смысла нет. Пусть это делает база данных. Напишите хранимую процедуру и вызывайте ее триггером по событию - ON UPDATE. В процедуре следует сверять изменилось ли состояние status, чтобы лишний раз не обновлять записи.
Помог с вопросом? Нажми тут ↓
0

#3 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 10:28 AM

Это тоже вариант, но в принципе что в пхп будет код по обновлению, что в базе.
не хотелось бы такую задачу переносить в базу.
0

#4 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,701
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 16 August 2013 - 10:29 AM

Вообще такие штуки делаются триггерами в БД.

В случае Yii - лучше это делать действительно в модели (только помнить, что AR-события не во всех случаях срабатывают). Это вполне ок, учитывая тот факт, что данные внезапно могут быть модифицированы не только из одного контроллера. Ну, например, дополнительное API какое-нибудь потребуется - и трындец. А так меньше логики таскать придется в случае чего.

Плюс ко всему прочему если в каждой модели повесить обработчик afterUpdate, к примеру, то можно выстраивать мощные цепочки типа обновилась модель - сработал обработчик, пнул связанную модель, сработал уже ее обработчик итд.

PS. В Yii2, кстати, уже из коробки идут oldAttributes, что позволяет без лишних телодвижений проверять изменение конкретного поля.
God is real unless declared as integer
0

#5 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 10:33 AM

View PostORey, on 16 August 2013 - 10:29 AM, said:

Вообще такие штуки делаются триггерами в БД.

В случае Yii - лучше это делать действительно в модели (только помнить, что AR-события не во всех случаях срабатывают). Это вполне ок, учитывая тот факт, что данные внезапно могут быть модифицированы не только из одного контроллера. Ну, например, дополнительное API какое-нибудь потребуется - и трындец. А так меньше логики таскать придется в случае чего.

Плюс ко всему прочему если в каждой модели повесить обработчик afterUpdate, к примеру, то можно выстраивать мощные цепочки типа обновилась модель - сработал обработчик, пнул связанную модель, сработал уже ее обработчик итд.

PS. В Yii2, кстати, уже из коробки идут oldAttributes, что позволяет без лишних телодвижений проверять изменение конкретного поля.


правильно ли я понимаю, что из одной модели таки прийдется дергать другую ?
или как вообще это все выстраивается ?
я пока себе вижу это как
class Stream extends CActiveRecord
{
    public function afterUpdate()
    {
        if (parent::afterUpdate())
        {
            if($true_logic) {
                News::model()->myMagicMethod();
            }
            return true;
        } 
        else
            return false;
    }

}

или есть какие-то более верные решения ?
0

#6 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,701
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 16 August 2013 - 10:35 AM

View PostSasha, on 16 August 2013 - 10:28 AM, said:

Это тоже вариант, но в принципе что в пхп будет код по обновлению, что в базе.
не хотелось бы такую задачу переносить в базу.


Нууу, зависит.

Я в таких случаях всегда думаю примерно так: а что будет, если БД может модифицироваться не только из одного скрипта?

И выходит, что либо всю работу с БД придется протаскивать через какое-то Yii-api, либо перевесить логику на БД и успешно сохранять консистентность при любых обстоятельствах. Хоть через вебинтерфейс работа идет, хоть из перлового скрипта, хоть через консоль БД: данные всегда находятся в нужном состоянии.
God is real unless declared as integer
0

#7 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 10:39 AM

View PostORey, on 16 August 2013 - 10:35 AM, said:

Нууу, зависит.

Я в таких случаях всегда думаю примерно так: а что будет, если БД может модифицироваться не только из одного скрипта?

И выходит, что либо всю работу с БД придется протаскивать через какое-то Yii-api, либо перевесить логику на БД и успешно сохранять консистентность при любых обстоятельствах. Хоть через вебинтерфейс работа идет, хоть из перлового скрипта, хоть через консоль БД: данные всегда находятся в нужном состоянии.


хм, хорошая мысль. это действительно более гибкое решение
задумался, спасибо!
0

#8 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,701
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 16 August 2013 - 10:39 AM

View PostSasha, on 16 August 2013 - 10:33 AM, said:

правильно ли я понимаю, что из одной модели таки прийдется дергать другую ?


Не вижу в этом ничего плохого. Если между моделями есть связь - это нормально.

Да, я примерно так и делаю.
God is real unless declared as integer
0

#9 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 10:40 AM

View PostORey, on 16 August 2013 - 10:39 AM, said:

Не вижу в этом ничего плохого. Если между моделями есть связь - это нормально.

Да, я примерно так и делаю.


у меня какое-то внутреннее недовольство от такого способа. даже если они связаны логически.
если надо делать такие вещи, то я пишу хелпер и переношу его запуск в контролер
0

#10 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,701
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 16 August 2013 - 11:04 AM

Вот поэтому и триггеры :)
Ну, если есть возможность писать свою БД-логику.
God is real unless declared as integer
0

#11 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 284
  • Joined: 15-April 13
  • Location:Ukraine

Posted 16 August 2013 - 11:10 AM

По личному опыту - триггеры в БД лучше событий AR.

Действительно события не всегда срабатывают, в частности у меня были проблемы с afterUpdate и afterSave. Возможно я что то делал неверно, но не стал заморачиваться и искать причину, а переделал все на триггеры. Перестали пропадать данные со статистик, перестали оставаться непонятные записи(хотя должны были удаляться).
Если честно сам поначалу боялся что тяжело и так далее, а на самом деле оказалось намного проще, ну и еще + выигрыш в производительности (по сравнению с тем же AR).
0

#12 User is offline   ORey 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 1,701
  • Joined: 20-April 09
  • Location:Moscow, Russia

Posted 16 August 2013 - 11:17 AM

View Postineersa, on 16 August 2013 - 11:10 AM, said:

Действительно события не всегда срабатывают, в частности у меня были проблемы с afterUpdate и afterSave. Возможно я что то делал неверно, но не стал заморачиваться и искать причину


Некоторые методы, типа updateAll/deleteAll принципиально не вызывают событий, просто sql сразу отправляют на исполнение. Ну, логично.

Впрочем, с БД-триггерами хорошо только там, где хранимая логика нормально поддерживается. В постгресе, например.
God is real unless declared as integer
0

#13 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 16 August 2013 - 11:35 AM

View Postineersa, on 16 August 2013 - 11:10 AM, said:

По личному опыту - триггеры в БД лучше событий AR.

Действительно события не всегда срабатывают, в частности у меня были проблемы с afterUpdate и afterSave. Возможно я что то делал неверно, но не стал заморачиваться и искать причину, а переделал все на триггеры. Перестали пропадать данные со статистик, перестали оставаться непонятные записи(хотя должны были удаляться).
Если честно сам поначалу боялся что тяжело и так далее, а на самом деле оказалось намного проще, ну и еще + выигрыш в производительности (по сравнению с тем же AR).



к примеру есть такие таблицы Table1 и Table2
В table1 есть внешний ключ с on delete cascade к полю в таблице Table2
тогда удаляя запись в Table1, то в Table2 события не сработают.
0

#14 User is offline   ineersa 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 284
  • Joined: 15-April 13
  • Location:Ukraine

Posted 16 August 2013 - 11:50 AM

View PostSasha, on 16 August 2013 - 11:35 AM, said:

к примеру есть такие таблицы Table1 и Table2
В table1 есть внешний ключ с on delete cascade к полю в таблице Table2
тогда удаляя запись в Table1, то в Table2 события не сработают.

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

#15 User is offline   Artur Zhdanov 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 112
  • Joined: 12-May 13
  • Location:Russia

Posted 18 August 2013 - 05:14 AM

Как сделали в итоге?
Помог с вопросом? Нажми тут ↓
0

#16 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 18 August 2013 - 05:15 PM

View PostArtur Zhdanov, on 18 August 2013 - 05:14 AM, said:

Как сделали в итоге?

пока курю тригеры, но что-то через pma они у меня не идут
0

#17 User is offline   __construct() 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 6
  • Joined: 15-October 12

Posted 03 September 2013 - 09:28 AM

Sasha, если у вас намечается сложная цепочка зависимостей моделей со статусами - то рекомендую попробовать плагин "simpleWorkflow": www.yiiframework.com/extension/simpleworkflow

Подробное описание здесь: http://s172418307.on...kflowdemo/index

Поддерживает маршруты статусов, позволяет задавать условия и триггеры при переходе "из статуса Х" или "в статус Х".
Мне хорошо помог навести порядок в зависимостях моделей, использующих статус.
0

#18 User is offline   Sasha 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 346
  • Joined: 14-December 09
  • Location:Киев

Posted 03 September 2013 - 09:39 AM

View Post__construct(), on 03 September 2013 - 09:28 AM, said:

Sasha, если у вас намечается сложная цепочка зависимостей моделей со статусами - то рекомендую попробовать плагин "simpleWorkflow": www.yiiframework.com/extension/simpleworkflow

Подробное описание здесь: http://s172418307.on...kflowdemo/index

Поддерживает маршруты статусов, позволяет задавать условия и триггеры при переходе "из статуса Х" или "в статус Х".
Мне хорошо помог навести порядок в зависимостях моделей, использующих статус.


спасибо, посмотрю !
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users