Будьте в спящем режиме выбирающая стратегия - когда использовать “соединение” и когда использовать “выбор”?

На самом деле есть два способа сделать это в Java 8 без каких-либо дополнительных библиотек или с использованием Java 9.

Если вы хотите печатать цифры от 2 до 20 на консоли, вы можете сделать это:

IntStream.iterate(2, (i) -> i + 2).peek(System.out::println).allMatch(i -> i < 20);

или

IntStream.iterate(2, (i) -> i + 2).peek(System.out::println).anyMatch(i -> i >= 20);

Выход в обоих случаях:

2
4
6
8
10
12
14
16
18
20

Пока никто не упомянул anyMatch . Вот почему этот пост.

47
задан serg 5 March 2009 в 23:22
поделиться

2 ответа

Соединение, как предполагается, решает n+1 проблему. Если у Вас будет 10 родителей, каждый с 10 детьми, то соединение потребует одного запроса, и выбор потребует 11 (один для родителей и один для детей каждого родителя). Это не может быть грандиозным предприятием, если база данных находится на том же сервере как приложение или если сеть действительно быстра, но если существует задержка в каждом вызове базы данных, это может сложить. Метод соединения немного менее эффективен на начальном запросе, потому что Вы копируете родительские столбцы в каждой строке, но Вы только делаете одно распространение в прямом и обратном направлениях к базе данных.

Обычно, если я знаю, что испытываю необходимость в детях всех родителей, я иду с соединением. Если я только испытываю необходимость в детях нескольких родителей, я использую выбор.

41
ответ дан Brian Deterling 7 November 2019 в 23:32
поделиться

Выбор выберет дочерние объекты путем издания нового запроса к базе данных для них. Соединение выберет дочерние объекты путем присоединения к ним в запрос родителя. Так вот почему Вы видите подобную производительность, даже с понижением количества запросов.

Выбор:

SELECT * FROM parent WHERE id=(whatever)
SELECT * FROM child WHERE id=(parent.child.id)

Соединение:

SELECT *
FROM parent
LEFT OUTER JOIN child ON parent.child.id=child.id
WHERE parent.id=(whatever)

относительно того, когда использовать один по другому... Не цельный уверенный. Это, вероятно, зависит от системы баз данных. Если бы Вы были всегда лучше, чем другой, я сомневаюсь, что они потрудились бы давать Вам опцию! Если бы Вы видите подобную производительность для каждого, я не волновался бы об этом.

9
ответ дан jdmichal 7 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: