Распределение записей по различным базам данных MySQL - альтернатива MySQL Proxy
Мой сценарий следующий:
Прямо сейчас я использую одну большую базу данных MySQL с несколькими таблицами для хранения пользовательских данных. Многие таблицы содержат столбцы с автоинкрементом.
Я хотел бы разделить это на 2 или более баз данных. Распределение должно быть сделано user_id и определено (не может быть рандомизировано). Например, пользователь 1 и 2 должен быть в базе данных1, пользователь 3 в базе данных2, пользователь 4 в базе данных3.
Так как я не хочу менять весь свой внешний интерфейс, я все же хотел бы использовать один адаптер БД и как бы добавить слой между генерацией запроса (внешним интерфейсом) и выполнением запроса (в правой базе данных). Этот слой должен распределять запросы в нужную базу данных на основе user_id.
Я нашел MySQL Proxy, который звучит именно так, как мне нужно. К сожалению, он в альфа-версии и не рекомендуется использовать в производственной среде.
Для php есть MySQL Native Driver Plugin API, который звучит многообещающе, но тогда мне нужен слой, который поддерживает как минимум php и java.
Есть ли другой способ достижения моих целей? Спасибо!
1 ответ
Этот сайт предлагает услугу, которую вы ищете (по цене).
Это позволяет вам анализировать и изменять запросы и результаты. Однако кажется, что для того, чтобы различать разные идентификаторы пользователей, потребуется всего пара строк кода, поэтому, несмотря на то, что mysql-proxy все еще находится в альфа-режиме, ваши потребности достаточно просты, чтобы я просто использовал прокси.
В качестве альтернативы, вы можете использовать любой серверный язык, который вы используете, чтобы получить их user.id информацию, а затем создать соединение mysql с соответствующей базой данных на основе этой информации. Вот какой-то php, который я собрал вместе, который по духу делает то, что, я думаю, ты собираешься делать.
</php
// grab user.id from wherever you store it
$userID = get_user_id($clientUserName);
$userpass = get_user_pass($clientUserName);
if ($userID % 4 == 0) { // every 4th user
$db = new mysqli('localhost', $clientUserName, $userPass, 'db4');
}
else if ($userID % 3 == 0) { // every 3th user
$db = new mysqli('localhost', $clientUserName, $userPass, 'db3');
}
else if ($userID % 2 == 0) { // every 2nd user
$db = new mysqli('localhost', $clientUserName, $userPass, 'db2');
}
else // every other user
$db = new mysqli('localhost', $clientUserName, $userPass, 'db1');
}
$db->query('SELECT * FROM ...;');
?>