Насколько я могу судить, вам нужно получить список сотрудников с соответствующей информацией, включая отдел.
Если это так, то это специально для INNER JOIN.Примерно так:
SELECT Employee.*, Department.dep_id, Department.dep_title
FROM Employee INNER JOIN Department
ON Employee.dep_id = Department.dep_id;
(хотя вы можете перепроверить это, мой SQL немного ржавый).
Это сделает то, что вам нужно, за один шаг.Тем не менее, все еще остается вопрос о том, что вы спрашиваете: «Более эффективно делать много маленьких запросов или один большой, и каковы последствия для производительности».
Ответ на этот вопроснемного специфичен для Флаттера.Когда вы делаете запрос с помощью SQFLITE, происходит то, что он обрабатывает все, что вы ему передали, отправляет его в java / objc и, возможно, выполняет больше обработки и передает обработку фоновому потоку, который затем вызывает библиотеку SQLITE, котораявыполняет дополнительную обработку, чтобы понять запрос, затем фактически читает данные на диске для выполнения операции, затем возвращается обратно на уровень java / objc, который передает ответ потоку пользовательского интерфейса, который, в свою очередь, отвечает обратно на dart.
Если это не звучит особенно эффективно, это потому, что это не = D.Если вы делаете это несколько раз (или даже несколько сотен), это, вероятно, хорошо, но если вы получаете тысячи, как вы заявляете, это может начать замедляться.
Альтернатива, которую вы предложили,сделать один большой запрос.Вы будете знать лучше меня, мудро ли это;если это пара тысяч, а не всегда пара тысяч, и возвращаемые вами данные всегда будут относительно небольшими (т. е. всего 10-20 символов имени и названия отдела), то вы скажете (20 + 20) * 2000 = 8000b = 80 КБ данных.Даже если вы предполагаете, что накладные расходы удвоят этот размер, 160 КБ данных не должно быть достаточно, чтобы потревожить любой относительно свежий смартфон (ведь это намного меньше, чем любая отдельная фотография!).
Теперь, взяв некоторый доменконкретные знания, вы могли бы оптимизировать это.Например, если вы знаете, что количество отделов намного меньше, чем сотрудников (то есть <100 или что-то еще), вы можете пропустить весь вопрос создания объединений и просто запросить все отделы до того, как это начнется, и поместить его в карту (dep_id => dep_title), а затем, как только вы попросите сотрудников, вы можете просто выполнить поиск из dep_id в dep_title самостоятельно.Таким образом, ваши запросы не должны будут включать dep_title снова и снова.
При этом вы можете рассмотреть вопрос о поиске сотрудника на странице, независимо от того, используете ли вы соединение.Вы сделали бы это, запрашивая 100 сотрудников (или любое другое число) за раз, а не за весь пакет - таким образом, у вас не было накладных расходов на 1000+ вызовов через стек, но у вас также нет большого блокаданных все в памяти все сразу.
SELECT * FROM Employee
WHERE employee_name >= LastValue
ORDER BY employee_name
LIMIT 100;
К сожалению, это не вписывается также в то, как флаттер делает списки, поэтому вам, вероятно, нужно иметь что-то вроде EmployeeDatabaseManager, который выполняетфактические запросы, и ваш список будет вызывать его, чтобы получить данные.Это, вероятно, выходит за рамки этого вопроса.