2013-06-11 3 views
2

я имею 8 баз данных с одинаковыми таблицамизапрос на нескольких базах данных лучшее решение

db0 
    tbluser | id | name 

db1 
    tbluser | id | name 

db2 
    tbluser 

db3 
    tbluser | id | name 

db4 
    tbluser | id | name 

db5  
    tbluser | id | name 

db6  
    tbluser | id | name 

db7 
    tbluser | id | name 

я есть another table dbcommon где пользовательские сообщения сохраняются

dbcommon 
    message | id | sender_id | recipient_id 

Моя проблема в том, что мне нужно запросить все сообщения с именем пользователя в нем на основе идентификатора отправителя и идентификатора получателя

Каков наилучший способ сделать это на mysql?

Мой подход теперь состоит в том, чтобы объединить все данные пользователя db1 с db7, используя объединение, а затем внутреннее соединение с сообщением в dbcommon, но я не уверен, что было бы хорошо, что если у меня есть миллион данных на пользовательской таблице выберите и союз будет проблемой.

Чтобы лучше понять мой вопрос. Я сделал это, но я не буду использовать его.

select *, sender.nickname as sender_name, recipient.nickname as recipient_name 
from dbcommon.message m 
inner join 
(
select * from db0.tbluser 
union 
select * from db1.tbluser 
union 
select * from db2.tbluser 
union 
select * from db3.tbluser 
union 
select * from db4.tbluser 
union 
select * from db5.tbluser 
union 
select * from db6.tbluser 
union 
select * from db7.tbluser 
) as sender on m.sender_id = sender.id 
inner join 
(
select * from db0.tbluser 
union 
select * from db1.tbluser 
union 
select * from db2.tbluser 
union 
select * from db3.tbluser 
union 
select * from db4.tbluser 
union 
select * from db5.tbluser 
union 
select * from db6.tbluser 
union 
select * from db7.tbluser 
) as recipient on m.recipient_id = recipient.id 
+1

почему на земле у вас есть 8 различных баз данных? Я МОГУ понять, если у вас было 8 похожих таблиц (и даже в этом случае, не так много), но 8 баз данных сумасшедшие –

+1

Если можно каким-либо образом переместить данные в один экземпляр базы данных. Я знаю, что это не вопрос вашего вопроса, но эта архитектура выглядит очень неправильно. – mzedeler

+0

hmm У меня есть японский клиент, и они предоставляют мне эти базы данных, я не могу изменить архитектуру, эти таблицы для игры, причина, почему они это сделали для обработки трафика, php-код будет выбирать, какую базу данных пользователь будет использовать, game – valrecx

ответ

5

Хотя я действительно думаю, что вы должны normalise ваша схема такова, что все эти таблицы объединены в один (возможно, с подходящим, проиндексированным по желанию, столбцом, который указывает исходную базу данных). Я думаю, что с статус-кво у вас есть только два варианта:

  1. Присоединяйтесь к UNION к message таблицу, как вы сейчас делаете (но, как видите, это не очень хорошо масштабируется): Вы можете определить VIEW, чтобы сэкономить на том, чтобы четко указаны UNION каждый раз, но это не будет иметь какой-либо выгоды от производительности.

  2. Если tbluser таблицы все используют двигатель MyISAM хранения, вы можете определить таблицу их союза с The MERGE Storage Engine:

    CREATE TABLE dbcommon.tblusers LIKE db0.tbluser; 
    
    ALTER TABLE dbcommon.tblusers 
        ENGINE = MERGE 
        UNION = (
          db0.tbluser, db1.tbluser, db2.tbluser, db3.tbluser, 
          db4.tbluser, db5.tbluser, db6.tbluser, db7.tbluser 
          ) 
    ; 
    

    Присоединение это к вашему message таблице должны дать значительный выигрыш в производительности по сравнению с предыдущим параметром.

+1

Я действительно хочу нормализовать эти базы данных, но мне не разрешено делать это, так как игра уже запущена. Я просто добавляю новые функции. – valrecx

+1

@valrecx: Существуют способы перехода живых систем на новую схему. Почему бы не задать вопрос об этом? – eggyal

+1

:(клиент не хочет вносить какие-либо изменения в свои существующие базы данных. – valrecx

1

вы можете использовать, как это:. (Но это не очень хорошая практика, чтобы иметь несколько баз данных для таких же

select d1.* from db1.dbcommon d1 inner join db2.tbluser d2 on d1.sender_id = d2.id 
UNION 
select d1.* from db1.dbcommon d1 inner join db2.tbluser d2 on d1.sender_id = d2.id 
+1

Ему нужно объединение таблиц, а не пересечение. – Barmar

+0

проверьте, разрешает ли ваша проблема. вы должны использовать внутренние соединения, чтобы получить правильный результат против пользователей. – skparwal

+1

Я отправил ответ вроде этого, но удалил его после того, как он указал, что отправитель может находиться в одной БД и приемнике в другом. Вам не хватает соединения на 'receiver_id'. – Barmar

-1

Используйте это:

SELECT NOME_USER, NOME_MAQ 
FROM anapula.utilizador as a 
    INNER JOIN cyber.maquinas as b ON a.ID_USER = b.COD_USER;