БД OpenCart "DELETE&INSERT vs UPDATE"

Тема в разделе "OpenCart", создана пользователем halfhope, 27 сен 2013.

  1. halfhope

    halfhope

    Регистрация:
    31 дек 2012
    Сообщения:
    284
    Симпатии:
    309
    Нашел такой код в модели setting/setting
    [​IMG]
    Потом понял, что все функции редактирования(во всех можелях), сначала удаляют обновляемые записи из БД, а потом вставляют новые. Вместо использования UPDATE.
    Я не специалист в БД, может быть этот метод чем-то оправдан. Почему у Даниела Керра такой подход?
     
    HPlus нравится это.
  2. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    Полного текста кода не видно, но если там действительно удаляется ровно то, что нужно удалить, то это ... ну просто бред. 2 запроса вместо одного ...
     
    halfhope нравится это.
  3. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    Да, есть такое, и это не только в таблице сеттингов встречается, почему так - однозначного ответа не знаю, но предполагаю, что повязано с автоинкриметном id настройки.
     
    halfhope нравится это.
  4. $iD

    $iD Команда форума

    Регистрация:
    13 мар 2012
    Сообщения:
    3.581
    Симпатии:
    1.482
    а к чему тут автоинкрмент? это ведь не deleteSetting, а editSetting - логично было бы всётаки делать UPDATE.
     
    halfhope нравится это.
  5. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    Ну, если уж разобрать детально функцию, и если уж сам Главнокомандующий влез в тему, то вот вся функция:
    PHP:
    public function editSetting($group$data$store_id 0) {
            
    $this->db->query("DELETE FROM " DB_PREFIX "setting WHERE store_id = '" . (int)$store_id "' AND `group` = '" $this->db->escape($group) . "'");

            foreach (
    $data as $key => $value) {
                if (!
    is_array($value)) {
                    
    $this->db->query("INSERT INTO " DB_PREFIX "setting SET store_id = '" . (int)$store_id "', `group` = '" $this->db->escape($group) . "', `key` = '" $this->db->escape($key) . "', `value` = '" $this->db->escape($value) . "'");
                } else {
                    
    $this->db->query("INSERT INTO " DB_PREFIX "setting SET store_id = '" . (int)$store_id "', `group` = '" $this->db->escape($group) . "', `key` = '" $this->db->escape($key) . "', `value` = '" $this->db->escape(serialize($value)) . "', serialized = '1'");
                }
            }
        }
    Тоесть могу сказать, что удаление\присвоение, происходить по идентификатору группы настроек (`group` = '" . $this->db->escape($group)), так как каждому ключу своё значение присваивается в определённой группе, тоесть проверка на if (!is_array($value)) - тут логично, если значения нет в массиве - добавляем вместе с группой, а второй запрос - уже под шумок... ибо под второй запрос ставить на апдейт так же нет резона, аргументирую... данные хранятся в "сериализированном виде", если мы добавляем (рассмотрим модуль "рекоммендуемые") новую схему с настройками, в табл. сеттингов, она не идёт новой строкой, а лишь добавляются в поле доп. данные...
     
    halfhope и $iD нравится это.
  6. Bogdan

    Bogdan

    Регистрация:
    25 фев 2013
    Сообщения:
    228
    Симпатии:
    104
    И что это объясняет? if (!is_array($value)) - конечно, логично - просто писать или писать сериализовано, но как это оправдывает DELETE+INSERT вместо UPADTE ..?
    Мне все же кажется что Ваше предположение по поводу автоинкремента единственно реальное. Зачем менять у записи id, но другие причины придумать не получается
     
  7. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    Приветствую, давай рассмотрим пример 1:
    Итак, дано:
    Теперь посмотрим, какой запрос идёт на редактирование, например добавления модуля в новую схему:
    PHP:
    //Общий запрос на редактирование
    $this->load->model('setting/setting');
              
            if ((
    $this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {      
                
    $this->model_setting_setting->editSetting('featured'$this->request->post);  
          
                
    $this->session->data['success'] = $this->language->get('text_success');
          
                
    $this->redirect($this->url->link('extension/module''token=' $this->session->data['token'], 'SSL'));
            }
    А именно на редактирование данных о расположении:
    PHP:
    //Тут конкретно запрос на смену данных по ключу группы feutered_module
    $this->data['modules'] = array();
      
            if (isset(
    $this->request->post['featured_module'])) {
                
    $this->data['modules'] = $this->request->post['featured_module'];
            } elseif (
    $this->config->get('featured_module')) {
                
    $this->data['modules'] = $this->config->get('featured_module');
            }
    Вид в базе с текущими настройками:
    1: Группа, в общем запросе мы это видим,
    2: запрос на редактирование во втором (featured_module),
    3: Сериализированные данные
    ________________________________________________________
    Пример 2 (продолжение):
    Ну и в базе:
    Вопрос, для тех, кто дальше задается вопросом апдейта, как обновить сериализированные данные по ключу featured_module в группе featured ? Поэтому - проверяемс (if (!is_array($value))) сереализованно и соотв затираем текущий и добавляем новый блок с обновлёнными данными по ключу... Попробуйте написать запрос на АПДЕЙТ для сериализированных данных если уж задали вопрос, будемс рассматривать варианты.
     
    Последнее редактирование: 28 сен 2013
    halfhope нравится это.