Eleneldil G. Arilou (arilou) wrote,
Eleneldil G. Arilou
arilou

Плата за абстракцию

Вот делают тут ребята CMS. Хорошую такую и логичную CMS, в которой можно описывать самую разнообразную логику устройства сайта, при этом не думая ни о каком SQL, думая только в терминах сущностей, из которых состоит сайт. Абстрагирование от конкретной БД, в которой всё хранится, берёт на себя ядро CMS.

Но вот бывает нужно сделать такую простую операцию как, скажем, увеличить текущее значение какого-либо счётчика. в общем, изменить значение, взяв за основу текущее. В SQL это можно было бы сделать одним запросом. Т.е. атомарно. А в CMS в интерфейсе её хранилища данных надо прописать операцию, которая сделает это. И то мы будем ограничены в выборе возможных действий (или придётся делать довольно неслабые навороты, чтобы дать пользователю писать формулу для изменения значения).

Грабли на этом пути нас поджидают: либо мы реализуем такое подмножество операций, которое есть у всех предполагаемых СУБД, либо придётся как-то правильно обрабатывать случай, если используемая СУБД не имеет нужной операции.

С точки зрения простоты реализации только и остаётся, что ставить на кусок данных блокировку, тащить данные в нашу программу, там изменять, записывать обратно, блокировку снимать. Итак эти блокировщики устроить, чтобы не забывать их все снимать не позднее окончания обработки запроса. Ну и смириться с тем, что для простой операции изменения одного числового поля мы сначала потащим данные из базы в приложение, там их обернём в принятый в нашем движке вид (в лучшем случае просто хэш, а то и, чего доброго, полноценный объект, а потом изменённые данные записывать обратно в базу. И счастье нам будет, если СУБД работает на том же компьютере. Ну ладно, путь и в другой виртуалке, ну прогуляются данные туда-обратно по внутренней петле TCP/IP...

Эх...
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 1 comment