Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Использовать несколько баз данных на одном домене  (Прочитано 1528 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Всем привет!
Прошу заранее не пиннать)
В общем есть скрипт складского учета. Система использует одну базу данных. (настройки подключения к базе в файле хранятся). Нужно чтобы каждый пользователь (группа пользователей) работала исключительно со своей БД на хостинге. Как это можно логически сотворить? может есть у кого соображения по счет этого? может кто сталкивался с подобным?

Возможно ли использовать несколько баз данных в рамках одного домена? т.е. скрипт один, но пользователь, авторизовавшись должен работать с отведенной для него MySQL базой на хостинге.

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
В общем есть скрипт складского учета. Система использует одну базу данных. (настройки подключения к базе в файле хранятся). Нужно чтобы каждый пользователь (группа пользователей) работала исключительно со своей БД на хостинге. Как это можно логически сотворить? может есть у кого соображения по счет этого? может кто сталкивался с подобным?

Неизвестно, что за скрипт складского учёта, что он делает и какая используется СУБД. Также не понятно, что именно нужно: работа скрипта с разными БД на одной СУБД, или работа с разными БД на разных СУБД (например, разные СУБД или разные версии одной СУБД).

Возможно ли использовать несколько баз данных в рамках одного домена? т.е. скрипт один, но пользователь, авторизовавшись должен работать с отведенной для него MySQL базой на хостинге.

Имеется ввиду несколько СУБД на одном IP или одна СУБД с разными БД на одном IP?
Возможно, просто для каждого пользователя (или группы пользоватлей) использовать свои настройки соединения с СУБД. Если необходимо использовать разные СУБД, то используются разные способы соединения (если скрипты находятся на том же компьтере, что и СУБД) или разные порты.
« Последнее редактирование: 18 Апреля 2014, 03:23:50 от unimix »

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
unimix,
Скрипт (далее - система) написан на PHP (использует MySQL).  Расположен на домене maindomain.ru. Система разделяет пользователей на группы - своего рода офисы разных компаний, имеющих уникальный идентификатор записей в базе данных, по которому и идет дальнейшая работа с данными базы (учет). На данном этапе - база данных одна. Т.е. Пользователь авторизуется, выбирается его принадлежность к группе(офису), затем права и потом уже все операции, совершаемые пользователем в системе ведутся под уникальным ID группы(офиса).
Нужно, чтобы каждый офис работал с отдельной БД из одного интерфейса (системы на maindomain.ru)
Можно, конечно сделать домен типа one.maindomain.ru и сказать пользователям- захадите туда и выделить отдельную базу... НО... Хочется, чтобы "точка входа", если грубо можно так назвать))) была одна, а потом, авторизовавшись в системе, пользователь работал(создавал документы, накладные, добавлял товары и т.д.) ИСКЛЮЧИТЕЛЬНО со своей базой данных.
Я просто, не сталкивался с подобным никогда, вот чувствую, что в скором так придется сделать... поэтому и прошу помощи)

PS: Домен один, скрипт системы один - а БД - у каждого своя. т.е. одна точка входа и распределение на N баз данных.

Оффлайн Magomed

  • Любитель
  • *
  • Сообщений: 92
    • Просмотр профиля
mygloo,
unimix дело говорит:
Если хотите использовать одну СУБД(MySQL) одной и той же версии для работы со всеми клиентами, то просто создайте разные базы данных и будет вам счастье :). Доступ к разным базам данных можно осуществить: если умеете подсоединиться к одной базе данных почему бы не создать еще n баз с именами db_n (например) и не коннектиться к ним по этому самому имени?

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
т.е. авторизация пользователя по одной БД?  потом селектом выделяем ту, что закреплена за группой и, соответственно все запросы адресуем по этому имени.

Оффлайн Magomed

  • Любитель
  • *
  • Сообщений: 92
    • Просмотр профиля
Допустим имеется одна СУБД. В ней n БД. В каждой БД, допустим, по m таблиц (если разные клиенты будут делать одно и то же, то, я думаю, различаться наборы таблиц не будут, а сами таблицы будут отличаться только наполнением).
Так, когда приходит клиент из офиса i соединяйте его с БД номер i. В этой БД будут только таблицы офиса i, больше никуда клиент лазить не сможет.

UPD_1:
А если нужно ограничить и список таблиц, с которыми может работать клиент, то это уже в php должно реализовываться.
« Последнее редактирование: 19 Апреля 2014, 01:20:47 от Magomed »

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Magomed,
Да,верно говорите! Я, просто раньше хотел чтобы все в одной базе было. А теперь, думаю, что может сделать каждому клиенту свою базу... и с резервным копированием легче будет (наверно=)) и с нагрузкой.. Но и скрипт не хотелось плодить, да и удобней когда точка входа одна. (и обновлять легче) Конечно, дааааалеко не кластерное решение))))))) Но, пока мой опыт только до такого дорос =)

UPD:
И, чисто схематически, как должна происходить тогда авторизация... Поиск пользователя последовательным селектом баз - не вариант, Либо авторизация одной централизованной БД а селект  той или иной БД пользователя будет исходить из пренадлежности его к тому или иному офису?
я что-то наверное торможу на счет логики...
« Последнее редактирование: 19 Апреля 2014, 01:32:10 от mygloo »

Оффлайн Magomed

  • Любитель
  • *
  • Сообщений: 92
    • Просмотр профиля
Наверное, реализовать это можно по-разному.
Мне видится примерно так:
В отдельной БД есть таблицы (одна таблица - один офис), в каждой таблице расписаны клиенты и их права.
На странице аутентификации коннектимся именно к этой БД и понимаем с кем имеем дело.
Потом уже коннектимся к БД нужного офиса и даем юзеру нужные права.
Как-то так 8)

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
Magomed,
Да, именно так я вас и понял) Завтра попробую так сделать) потом отпишу что получилось)
Magomed, спасибо, большое)

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
С одним соединением:

1. Подсоединяемся к БД с данными авторизации:
Код: (php) [Выделить]
$mysqli = new mysqli("localhost", "all_user", "all_password", "db_auth");2. Проводим авторизацию и определяем ID базы данных пользователя (допустим в $user_db).
3. Меняем базу данных авторизации на базу данных пользователя:
Код: (php) [Выделить]
$mysqli->select_db('userdb_' . $user_db);
В таком случае существует один пользователь в СУБД, который имеет доступ как к БД авторизации ("db_auth"), так и к БД пользователей ('userdb_' . $user_db).

Со сменой пользователя:

1. Подсоединяемся к БД с данными авторизации:
Код: (php) [Выделить]
$mysqli = new mysqli("localhost", "all_user", "all_password", "db_auth");2. Проводим авторизацию и определяем ID базы данных пользователя, логин и пароль для соединения к пользовательской БД (допустим в $user_db, $user_name, $user_pass).
3. Закрываем соединение авторизации:
Код: (php) [Выделить]
$mysqli->close();4. Открываем новое соединение с базой данных пользователя:
Код: (php) [Выделить]
$mysqli = new mysqli("localhost", $user_name, $user_pass, $user_db);
В таком случае пользовательская БД может иметь своего юзера со своими правами. В дальнейшем, можно хранить авторизационные данные пользователя в кэше и не производить каждый раз определение авторизационных данных соединения с пользовательской БД.

Вместо пунктов 3 (закрытие) и 4 (открытие) можно так:
Код: (php) [Выделить]
$mysqli->change_user($user_name, $user_pass, $user_db);
« Последнее редактирование: 19 Апреля 2014, 02:03:47 от unimix »

Оффлайн mygloo

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
unimix,
Спасибо, огромное,+++ за подробное описание! обязательно опробую, поэксперементирую!=)

 

Страница сгенерирована за 0.031 секунд. Запросов: 25.