Распределение записей по различным базам данных 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 ответ

Этот сайт предлагает услугу, которую вы ищете (по цене).

http://www.sqlparser.com/

Это позволяет вам анализировать и изменять запросы и результаты. Однако кажется, что для того, чтобы различать разные идентификаторы пользователей, потребуется всего пара строк кода, поэтому, несмотря на то, что 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 ...;');

?>

Другие вопросы по тегам