Предложения по поиску связанных данных в базах данных с разными логинами? - PullRequest
0 голосов
/ 03 мая 2009

У меня есть массив идентификаторов пользователей в запросе из базы данных A, таблица A (AA).

У меня есть основная база данных пользователей в базе данных B, таблица A (BA).

Для каждого идентификатора пользователя, возвращенного в массиве результатов из AA, я хочу получить имя и фамилию этого идентификатора пользователя из BA.

Различные учетные записи пользователей контролируют каждую базу данных. К сожалению, каждый логин не может иметь разрешения для каждой базы данных.

Вопрос: Как я могу получить первые и длительные записи с наименьшим количеством запросов и / или времени обработки? С 20 пользователями в массиве? С 20 000 пользователей в массиве? На порядок выше, если применимо?

Использование php 5 / mysql 5.

Ответы [ 2 ]

2 голосов
/ 03 мая 2009

Пока базы данных находятся на одном сервере, используйте перекрестное объединение баз данных. Для входа в базу данных для доступа к данным также потребуются разрешения для обеих баз данных. Что-то вроде:

SELECT AA.userID, BA.first, BA.last
FROM databasename.schema.table AA
INNER JOIN databasename.schema.table BA ON AA.userID = BA.userID

В ответ на комментарии:

Не думаю, что правильно прочитал часть о нескольких входах в систему, извините. Вы не можете использовать два разных входа в MySQL для одного подключения. Если вам нужно сделать несколько запросов, у вас есть только три варианта. A) Переберите первый набор результатов и выполните несколько запросов. Б) Запустите запрос, который использует предложение WHERE с userID IN (@firstResultSet) и передайте первый набор результатов. C) Выберите все из второй БД и объедините их в коде.

Все три из этих опций не очень хороши, поэтому я хотел бы спросить, почему вы не можете изменить права пользователя для одной из двух БД? Я также хотел бы спросить, зачем вам нужно выбирать имена и идентификаторы 20 000 пользователей? Если это не какой-то тип дампа данных, я бы искал другой способ отображения данных, который был бы более простым в использовании и менее требовательным к запросам.

Все сказанное, какой бы вариант вы ни выбрали, будет зависеть от множества различных обстоятельств. При небольшом количестве записей, менее 1000, я бы использовал вариант B. При большем количестве записей я бы, вероятно, использовал параметры C и попытался бы поместить два набора результатов во что-то, что можно объединить (например, с помощью array_combine).

0 голосов
/ 03 мая 2009

Я думаю, что они имеют в виду, что это должно быть возможно в двух вызовах базы данных.

Ваш первый, кто получил идентификаторы из базы данных A, и второй, который передал их в базу данных B.

Я не знаю mysql, но в sqlserver я бы использовал тип данных xml и передавал все идентификаторы в оператор, использующий это. Перед типом данных xml я бы создал динамический SQL с идентификаторами в операторе IN.

ВЫБЕРИТЕ идентификатор пользователя из базы данныхA.TableA

Перебирайте идентификаторы и создайте строку через запятую.

"SELECT FirstName, фамилия FROM DataBaseB.TableA, ГДЕ ИД пользователя (" + stringId + ")"

Проблема в том, что с 20 000 идентификаторов у вас могут возникнуть проблемы с производительностью при отправке данных. Здесь я бы использовал тип данных XML, поэтому, возможно, посмотрите, какие альтернативы есть у mysql для передачи списков идентификаторов.

...