За последние 24 часа нас посетили 17780 программистов и 1622 робота. Сейчас ищут 1855 программистов ...

Проектирование БД

Тема в разделе "MySQL", создана пользователем bizovo, 18 апр 2010.

  1. bizovo

    bizovo Активный пользователь

    С нами с:
    25 мар 2009
    Сообщения:
    42
    Симпатии:
    0
    Всем привет!
    Постановка:
    Необходимо загружать товар из xls файла в БД (MySQL), файл состоит из след полей: Тип товара, Марка, Модель, Название товара, Цена, Уникальный номер со стороны клиента.
    Получается 6 полей
    Таблица goods БД будет состоять из след. полей:
    id, mark, model, name, price, idx, visible, update
    где
    id-уникальный номер в БД, (index)
    tip-Тип товара, (index)
    mark-Марка, (index)
    modelМодель, (index)
    name-Название товара,
    price-Цена,
    idx-Уникальный номер со стороны клиента, (index)
    visible-видимость для всех пользователей, (index)
    update-признак обновлена строка или нет (index)
    Поля марка и модель это id из таблиц marka и model.
    Для разбора xls файла нашел в инете парсер.
    Разбираю товар след. образом:
    1. update-ом возвожу переменную update и visible в ноль.
    2. Сравниваю поля марка и модель с таблицей marka и model, идет сравнение текстового поля, если совпадает извлекаю id и вставляю в табл. goods.
    3. slect-ом проверяю есть ли в табл. goods данная позиция, путем сравнения поля idx с полем из файла "Уникальный номер со стороны клиента".
    4. select-ом проверяю в базе записи на повтор поля idx, т.к. эти поля должны быть уникальны для данного продовца, но не уникальными в пределах всей таблицы.
    5. Если пункт 3 true то делаю update табл. goods и обновляю все поля, причем поля update и visible возвожу в 1.
    6. Если пункт 3 fals тогда делаю insert.
    7. Если пункт выдает true, то сообщаю что есть дубликат и запись остаётся неизменной, о чем выводится ошибка.
    Вобщем прежде чем записать или обновить строку я делаю 5 запросов, не считая одного перед циклом (пункт 1) им можно принеберчь.
    Естественно таким образом я сильно нагружаю БД и максимум записать получается 1500 позиций, а их может быть несколько 10-ов тысяч. Еще Обращаю внимание, что парсер xls тоже затягивает 1процесс.
    Как мне ускорить время загрузки товара?
    Если сделать поля mark и model не (index), а внешними ключами, ускорю процесс?
    Интересно послушать мнение кто сталкивался с такой проблемой.
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Несколько сумбурно все описано. Не всегда понятно откуда и какие данные с чем сравниваются и зачем.

    Как стоит делать обновление.
    1. залить все данные из файла во временную таблицу в один присест.
    2. извлечь id записей которых нет в принципе и перенести из временной таблицы в основную (вроде как можно помучатся и сделать это одним запросом).
    3. Сделать нужные проверки для остальных (тоже 1-2 запроса на все записи сразу)
    4. выполнить апдейты (вот тут не помню, скорее всего 1 запрос на каждую запись, но можно помедитировать над INSERT ON DUPLICATE KEY UPDATE)

    Для записей уникальных для продавца - сделать сурогатный уникальный ключ
    вида (idsaler, idx), где idsaler - продавец, а idx - тоже что и у Вас.
    Тогда проверку целостности будет делать сама БД.

    Для полей "марка" и "модель" непонятно какие данные сравниваются (то ли из БД, то ли из xls) и соответственно нужен ли вообще внешний ключ - неясно. (но смена index на foreign key ничего не ускорит :) )

    Итого число запросов от N+4 до 3*N + 4, где N число строк записей в xls
     
  3. bizovo

    bizovo Активный пользователь

    С нами с:
    25 мар 2009
    Сообщения:
    42
    Симпатии:
    0
    Спасибо, буду делать.
     
  4. bizovo

    bizovo Активный пользователь

    С нами с:
    25 мар 2009
    Сообщения:
    42
    Симпатии:
    0
    Пытаюсь сделать след.
    Код (Text):
    1.  
    2. include "../lib/mysql/mysql.php";
    3. require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
    4. $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname);
    5. if($rm=$db->sql_query("CREATE TEMPORARY TABLE temp (tip int(4) NOT NULL, mark varchar(255), INDEX (tip), INDEX (mark))"))
    6.     echo"Таблица созданна<br>";
    7. else
    8.     echo"Таблица не созданна<br>";
    9. if($rm=$db->sql_query("insert into temp (tip, mark) values ('1','mark')"))
    10.     echo"Данные добавленны<br>";
    11. else
    12.     echo"Данные не добавленны<br>";
    выдает Таблица не созданна
    Данные не добавленны
    использую mysql класс где:
    $this->db_connect_id = mysql_connect($this->server, $this->user, $this->password)
    Почему не создается таблица?
    пробую ч/з phpmyadmin запрос выполняется успешно
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    mysql_error() воспользоваться не судьба?
     
  6. bizovo

    bizovo Активный пользователь

    С нами с:
    25 мар 2009
    Сообщения:
    42
    Симпатии:
    0
    Вот, что пишет
    1044: Access denied for user: '@localhost' to database 'mydb_bsd'
    это как понимать?
     
  7. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    имя пользователя не задано.
     
  8. bizovo

    bizovo Активный пользователь

    С нами с:
    25 мар 2009
    Сообщения:
    42
    Симпатии:
    0
    Нет у меня пользователя, к этому файлу у меня все подцепленно:
    Код (Text):
    1.  
    2. require_once($_SERVER['DOCUMENT_ROOT'].'/config.php');
    И все работает
    Если вот так сделать
    Код (Text):
    1.  
    2. $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname);
    3. echo mysql_errno() . ": " . mysql_error() . "<br>";
    то ошибки нет
    а чуть ниже
    Код (Text):
    1.  
    2. if($rm=$db->sql_query("CREATE TEMPORARY TABLE temp (tip int(4) NOT NULL, mark varchar(255), INDEX (tip), INDEX (mark))"))
    3.     echo"Таблица созданна<br>";
    4. else
    5. {
    6.     echo"Таблица не созданна<br>";
    7.     echo mysql_errno() . ": " . mysql_error() . "<br>";
    8. }
    ошибку выдает
     
  9. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    И чем я могу помочь?

    Возможно отсутствующий пользователь не имеет прав на создание таблиц.
    Рекомендую все же использовать с именем пользователя.