Наприклад, скажіть, що я хочу отримати Користувача та всі його телефонні номери та адреси електронної пошти. Номери телефонів та електронні листи зберігаються в окремих таблицях, один користувач на багатьох телефонах / електронних листах. Я можу це зробити досить легко:
SELECT * FROM users user
LEFT JOIN emails email ON email.user_id=user.id
LEFT JOIN phones phone ON phone.user_id=user.id
Проблема * в цьому полягає в тому, що він повертає ім’я користувача, DOB, улюблений колір та всю іншу інформацію, що зберігається в таблиці користувачів, знову і знову для кожного запису (записи електронної пошти користувачів електронною поштою ), імовірно, збільшуючи пропускну здатність і сповільнюючи зниження результатів.
Чи не було б приємніше, якби він повертав по одному рядку для кожного користувача, і всередині цього запису був список електронних листів та список телефонів? Це також полегшило б роботу з даними.
Я знаю, що ви можете отримати такі результати, використовуючи LINQ або, можливо, інші рамки, але це, здається, є слабкістю в базовій конструкції реляційних баз даних.
Ми могли б обійти це за допомогою NoSQL, але чи не повинно бути середнього?
Я щось пропускаю? Чому цього не існує?
* Так, це розроблено таким чином. Я розумію. Мені цікаво, чому немає альтернативи, з якою легше працювати. SQL може продовжувати робити те, що він робить, але потім вони могли б додати ключове слово або два, щоб зробити трохи постінгової обробки, яка повертає дані у вкладеному форматі замість декартового продукту.
Я знаю, що це можна зробити на мові сценаріїв за вашим вибором, але це вимагає, щоб сервер SQL або надсилав зайві дані (приклад нижче), або щоб ви видавали кілька запитів на кшталт SELECT email FROM emails WHERE user_id IN (/* result of first query */)
.
Замість того, щоб MySQL повертав щось подібне до цього:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "johnsmith45@gmail.com",
},
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"email": "john@smithsunite.com",
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"email": "originaljane@deerclan.com",
}
]
І тоді потрібно згрупувати якийсь унікальний ідентифікатор (а це означає, що мені потрібно це також отримати!) На стороні клієнта, щоб переформатувати набір результатів так, як вам потрібно, просто поверніть це:
[
{
"name": "John Smith",
"dob": "1945-05-13",
"fav_color": "red",
"emails": ["johnsmith45@gmail.com", "john@smithsunite.com"]
},
{
"name": "Jane Doe",
"dob": "1953-02-19",
"fav_color": "green",
"emails": ["originaljane@deerclan.com"],
}
]
Крім того, я можу задати 3 запити: 1 для користувачів, 1 для електронних листів та 1 для номерів телефонів, але тоді набори результатів електронної пошти та номера телефону повинні містити user_id, щоб я міг співставити їх із резервними копіями з користувачами Я раніше забирав. Знову-таки, зайві дані та непотрібна післяобробка.