За последние 24 часа нас посетили 30516 программистов и 1754 робота. Сейчас ищут 986 программистов ...

Прямое соединение с БД или API?

Тема в разделе "PHP и базы данных", создана пользователем qwermus, 27 окт 2014.

  1. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Добрый день, уважаемые форумчане.
    Задача у меня стоит следующая. Есть 6 сайтов, которые используют один и тот же каталог. Очень неудобно вносить изменения в каталог на каждом сайте в отдельности. Хочу унифицировать, т.е. разместить каталог на основном сайте, а с других просто брать из него данные.
    Все сайты размещены на одном хостинге (1gb.ru, хотя хочу его сменить). Размер таблицы (MySQL) с каталогом около 30тыс.записей.
    Вот думаю, как будет правильнее поступить - делать прямое подключение к БД и брать данные, как и раньше. Или же написать API, который будет возвращать данные в виде XML. Первый вариант, мне кажется, будет быстрее работать (не надо формировать XML, читать ответ и потом разбирать его на части). Хотя, порывшись в сети, неоднократно встретил рекомендации использовать именно API. Но почему именно - так и не понял.
    Скажите, пожалуйста, как бы в этой ситуации поступили Вы, и почему? Или, может, у Вас есть третий вариант решения этой задачи?
    Заранее благодарю за ответ
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Если основной проект и спецпроекты у вас приспособлены для такого разделения, то да, вы можете разделить проекты, обращаясь к базовому домену за данными по api. Для этого, помимо правильной структуры, долженбыть написан api взаимодействия для получения всех необходимых для спецпроектов данных. Иными словами, должен быть написан полноценный веб-сервис.
    Если проекты написаны на объектной модели, а не тонны инклудов с процедурным кодом, то задача рефакторинга будет немного проще.
    Чем меньше спец-проекты или сателлиты отличаются от основного сайта, тем проще будет их отделение.
    Если у вас основной проект и спутники связаны только общими данными в бд и имеют полностью независимые и никак не связанные друг с другом объекты, тогда разумеется, достаточно просто своего подключения к СУБД и можно растаскивать все проекты по разным серверам/доменам/каталогам.
    Если же у вас спецпроекты наследуют базовые сущности основного проекта, где помимо подключения к бд могут быть сущности пользователя, раздела, статьи, не говоря уже о базовых контроллерах, то, соответственно, это уже совершенно другая задача реализация которой может заключаться в создании базовых классов спецпроекта, взаимодействующие с основным ресурсом через api.
    Формат обмена данными как и протокол реализации веб-сервиса - это уже детали реализации которые выбираются исходя из конкретной специфики вашего проекта, которую нужно знать чтобы рекомендовать конкретный выбор.
    В классическом исполнении это разработка REST api для всех данных проекта, которые востребованы сателлитами и реализация базовых классов, общих для сателлитов, их получающих.
     
  3. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Спасибо за развернутый ответ.
    Сайты никак не связаны. Т.е. создание второго подключения к б.д. с другим названием не вызовет никаких проблем:
    Код (Text):
    1.  
    2. // Подключаемся к БД сайта
    3. $site = mysql_connect("localhost", "name", "password");
    4. mysql_select_db("db1", $site );
    5.  
    6. // Подключаемся к БД сайта основного сайта (где база)
    7. $maingroupsite = mysql_connect("localhost", "name2", "password2");
    8. mysql_select_db("db2", $maingroupsite);
    9.  
    10. // Выбираем данные
    11. mysql_query("SELECT text FROM content WHERE id=7", $site)); // Какой-то текст из базы текущего сайта
    12. mysql_query("SELECT title FROM catalog WHERE id=5", $maingroupsite)); // Какой-то товар из базы основного сайта
    Вот пример конструкции, какая может встретить на сайте. Первым запросом мы выбрали из первой базы, вторым запросом - из второй. Все это отлично работает, и я уже делал нечто подобное.
    Вы считаете, что таким образом будет лучше, чем отдельный API, верно я понял?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а до главного какие пинги с сайтов?
     
  5. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Простите, не понял вопрос
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    это уже зависит от того насколько разные данные запрашивают ваши сателлиты. Кто будет вести дальнейшую разработку, как часто предстоит модернизировать проекты, пишут они в базу или нет.
    Через api вы получите единую точку входа для всех запросов с сателлитов что предоставляет определённые преимущества и накладные расходы на разработку и взаимодействе не напрямую с бд. Выбор зависит уже от конкретной специфики ваших проектов.
    Опять же, нужно учесть и ограничение площадки, ведь в случае с подключением напрямую к бд всех 6 сайтов вы займете сразу 6 соединений, при том что на многих площадках хостинга число этих соединений может быть лимитировано несколькими десятками.
    В общем случае, если работает и каши не просит, то пусть работает ибо к таким глобальным изменениям, как единый api, нужно приходить четко видя в них потребность.
     
  7. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Веду проекты я и в ближайшем будущем вести тоже буду я. Мне предстоит в любом случае переделывать, просто стоит вопрос, идти одним или вторым путем.
    А что будет лучше по быстродействию? Хостинг 1gb.ru меня огорчает скоростью работы, а когда получится его вменить - неизвестно (не от меня зависит). Поэтому надо много внимания уделять этому вопросу.
     
  8. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Что быстрее выполнится запрос к СУБД на извлечение строки из таблицы или запрос к контроллеру REST-api на получение этой же строки?
    Вопрос в другом. Важны-ли доли секунды или правильно поставленная и безопасная разработка независимых связанных проектов. И есть-ли реальная потребность и ресурсы для реализации последнего.
     
  9. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Понятно, что прямой запрос быстрее. Вопрос в том, насколько:) Видимо, стоит сделать один и второй вариант, погонять на разных хостах и решить для себя, что лучше. Если разница не существенная, то склонюсь, наверное, к АПИ. Если же разница большая (а при росте БД в будущем еще и увеличиваться будет), то лучше прямой запрос.
    Кстати, небольшой вопрос на тему "рост БД". В БД есть две основных категории, где много товаров (скажем, по 15тыс.), и далее мелкие категории, где по сотне. Есть ли смысл две основные категории отделить от общей таблицы. Сделать в БД три таблицы:
    table_catalog
    table_catalog1
    table_catalog2
    Если использовать API для получения данных, очень легко в самом начале определить, из какой таблицы брать данные:
    Код (Text):
    1.  
    2. if (category == 1) $tablename = 'catalog1';
    3. else if (category == 2) $tablename = 'catalog2';
    4. else $tablename = 'catalog';
    Как Вы думаете, скажется ли это существенно на скорости выбора данных из таблиц? Или не стоит заморачиваться? В принципе, 30тыс товаров - это не сильно много. Индексы для столбов id и parent_id проставлены
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    нет.
     
  11. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Спасибо большое за ответы. Больше вопросов не имею:)
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не сильно. в идеале разница пара-тройка мс в пользу прямого запроса. С другой стороны апи позволит сделать хоть сто запросов локально, а выдать один ответ сразу.

    Какое у вас время пересылки пакетов между серваками?
     
  13. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Сайты находятся на одном сервере. Мне кажется, соединение со второй базой времени не отнимает совсем. По крайней мере счетчик показывает примерно одно время выполнения как в своей базе, так и в другой
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    блин. Тогда и вопрос надо формулировать так "все сайты на одном сервере, подключаться ли локально к локальной бд?"...
     
  15. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    А разве я не так сформулировал вопрос? Даже указал, на каком именно
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Что значит "на каком"? Они же все на одном.

    Добавлено спустя 1 минуту 57 секунд:
    Сервер это не хостинг. Хостинг это не сервер. Так один сервер или один хостинг?
     
  17. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Не знаю, на одном или нет. Хостинг один. А физически на разных машинах или нет - не знаю. Вероятно, что на разных. Подбиваю хозяина сайта сменить хост, а то 1gb глючный очень. Но когда это случится - неизвестно.
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    надо замерить время подключения к главному. если там 2-3 мс, то пофик.
     
  19. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    К этому и пришли выше. Завтра напишу простенький апи и померяю разницу в скорости выполнения.
    При условии, что разница минимальна, что бы предпочли лично Вы - АПИ или прямое подключение? И почему?
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто пингани =)
     
  21. qwermus

    qwermus Новичок

    С нами с:
    27 окт 2014
    Сообщения:
    21
    Симпатии:
    0
    Ок. Спасибо