Соединение SQL против агрегации кода - PullRequest
1 голос
/ 06 мая 2019

Я пытаюсь разработать наиболее оптимальный способ получения совокупной информации из моей реляционной базы данных (mysql). У меня есть две таблицы: поставщик и модель. Отношение между ними одно к нескольким, то есть у поставщика может быть несколько моделей, а модель может быть связана только с одним поставщиком.

Каков наилучший способ получения информации из обеих таблиц, чтобы у каждого поставщика были свои связанные модели? Моя идея состоит в том, чтобы создать REST API, чтобы он мог иметь следующий вывод:

{
    name: "one",
    description: "one description",
    models: [
        {
            name: "one_model_1",
            price: 100
        },
        {
            name: "one_model_2",
            price: 200
        }
    ]
    ...
  1. Получить, сделав соединение между обеими таблицами. Таким образом, будет получен следующий вывод:

    select v.name as vendorName, v.description as vendorDescription, m.name 
    as modelName, m.price as modelPrice from vendor v inner join model m on 
    v.id = m.vendor_id;
    

    1

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

  2. Сначала выполните поиск по всем поставщикам, а затем зациклите их, чтобы получить связанные модели. Здесь будет представлена ​​проблема N + 1, так как для получения моделей потребуется запрос N поставщиков, а затем N запросов.

  3. Сначала выполните поиск поставщиков. Затем из идентификаторов поставщиков будут извлечены все модели, а связь между поставщиком и моделью будет выполнена с помощью кода.

Интересно, что было бы лучшим решением?

Ответы [ 2 ]

1 голос
/ 10 мая 2019
SELECT v.Name, v.Description,
       GROUP_CONCAT(CONCAT(m.Name, ':', m.Price))
    FROM Vendors AS v
    JOIN Models AS m ON v.id = m.vendor_id
    GROUP BY v.Name, v.Description

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

0 голосов
/ 07 мая 2019

Вариант 1 будет вашим наиболее эффективным из перечисленных вами.Требуется наименьшее количество вызовов базы данных (наименьшее количество циклов между приложением и БД).

...