Выгружаемые результаты при выборе данных из 2 баз данных

#database #web-services

#База данных #веб-сервисы

Вопрос:

Привет
У меня есть один веб-сервис, подключенный к одной базе данных, в которой есть таблица под названием clients, содержащая некоторые данные.
У меня есть другой веб-сервис, подключенный к другой базе данных, в которой есть таблица под названием clientdetails, содержащая некоторые другие данные.
Я должен вернуть выгружаемый список клиентов, и каждый объект клиента содержит информацию из обеих таблиц.
Но у меня проблема.
Критерии поиска должны применяться к обеим таблицам.
Таким образом, в основном в таблице clients у меня могут быть свойства:
cprop1, cprop2
в таблице clientdetails у меня могут быть cdprop1, cdprop2
и мои критерии поиска могут быть cporp1 = something, cdprop2 = somethingelse

Я вызываю первую веб-службу и отправляю ей критерии cporp1 = something
, и она возвращает некоторую информацию, а затем я вызываю метод во второй веб-службе, но если мне нужно вернуть, скажем, 10 элементов на странице, а критерии второй веб-службы применяются к 10 элементам, выбранным первой веб-службой (cdprop2 = somethingelse), то у меня может остаться 8 элементов или вообще ни одного.
Итак, что мне делать в этом случае?
Как я могу убедиться, что я всегда получаю нужное количество элементов (то есть столько, сколько пользователь говорит, что он хочет на странице)?

Ответ №1:

Пока у вас не будут оба ответа, вы не знаете, сколько записей вам придется отобразить.

Вы не указываете, какой тип доступа к базе данных вы используете, вы подразумеваете, что запрашиваете «N записей, соответствующих критерию X», где для N установлено значение 10. В некоторых механизмах доступа к БД вы можете запросить все совпадающие записи, а затем переместить «курсор» по набору, следовательно, вам не нужно устанавливать какую-либо верхнюю границу — мы предполагаем, что БД позаботится об эффективном управлении ресурсами для такого запроса.

Если вы не можете этого сделать, то вам нужно иметь возможность повторно обратиться к первой базе данных с запросом следующих 10 записей, повторяйте, пока, наконец, страница не заполнится или больше записей не будет найдено. Для этого требуется, чтобы у вас был какой-либо способ указать запрос для «следующих 10».

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

Ответ №2:

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