Гатча із заточуванням полягає в тому, що додаток повинен знати, який фрагмент запитувати. Взагалі, це робиться шляхом загострення на щось на зразок клієнта. Я пристосую одне зі своїх старих дописів у блозі, щоб використовуватись як свою відповідь.
Коли ви створюєте додаток для багатьох клієнтів, існує два поширених способу проектування бази даних:
- Варіант A: Помістіть усіх клієнтів в одну базу даних
- Варіант 2: Створіть одну базу даних на кожного клієнта
Розміщення всіх клієнтів в одній базі даних
Це просто: просто додайте таблицю Клієнта у верхній частині схеми, додайте таблицю ClientUsers, щоб переконатися, що люди бачать лише власні дані, і ми вирушаємо.
Переваги такого підходу:
Простіше управління схемами. Коли розробники розгортають нову версію програми, їм потрібно лише внести зміни схеми в одну базу даних. Не хвилюйтеся, що різні клієнти не синхронізовані або невірні версії.
Простіша настройка продуктивності. Ми можемо перевірити використання індексу та статистику лише в одному місці, легко впровадити вдосконалення та негайно побачити ефекти для всіх наших клієнтів. Маючи сотні чи тисячі баз даних, навіть найменші зміни можуть бути важкими для узгодження. Ми можемо перевірити вміст кеш-пам’яті процедур і знати, наскільки запити чи збережені процедури є найбільш інтенсивними для всієї нашої програми, тоді як якщо ми використовуємо окремі бази даних на клієнта, у нас може бути більше часу, агрегування використання запитів у різних планах виконання.
Простіше створити зовнішній API. Якщо нам потрібно надати доступ до всієї нашої бази даних для сторонніх людей для створення продуктів, ми можемо зробити це простіше, якщо всі дані знаходяться в одній базі даних. Якщо API має справу з групуванням даних з декількох баз даних на декількох серверах, це додає час розробки та тестування. (З іншого боку, ця річ "декількох серверів" починає натякати на обмеження для сценарію "одна для керування правилами" для всіх: одна база даних означає, що все наше навантаження впливає лише на один сервер бази даних.) У вашому випадку , з PowerBI, наявність усіх в одній базі даних значно полегшить управління з'єднаннями.
Легше висока доступність та відновлення після аварій. Керувати дзеркальним відображенням у базі даних, доставкою журналів, реплікацією та кластеруванням насправді дуже просто, якщо все, про що ми маємо турбуватися, - це лише одна база даних. Ми можемо швидко збудувати інфраструктуру.
Поміщення кожного клієнта у його власну базу даних або осколок
Вам все ще потрібен список клієнтів, але тепер він стає каталогом - для кожного клієнта ви також відстежуєте фрагмент, в якому він живе. Під час запуску додаток запитує цю таблицю та зберігає її в оперативній пам'яті. Коли йому потрібні дані для клієнта, він підключається безпосередньо до цього фрагмента (база даних та сервер).
Переваги такого підходу:
Легше відновлює одного клієнта. Клієнти - ненадійні м'ясні пакетики. (За винятком моїх - вони надійні м'ясні пакетики.) У них є всілякі "ой" моменти, коли вони хочуть повернути всі свої дані до певного часу, і це величезна біль ззаду, якщо їх дані переплутані інші дані клієнта в тих же таблицях. Відновлення за сценарієм однієї клієнтської бази даних є легким для мозку: просто відновіть базу даних клієнта. Ніхто більше не постраждав.
Простіший експорт даних. Клієнти люблять отримувати свої дані. Вони хочуть, щоб безпека знала, що вони можуть отримати свої дані в будь-який час, уникаючи жахливого сценарію блокування постачальника, і вони хочуть робити власну звітність. Окремі дані кожного клієнта, виділені у його власну базу даних, ми можемо просто надати їм копію власної резервної копії бази даних. Нам не потрібно будувати API експорту даних.
Легша масштабованість на декількох серверах. Коли нашому додатку потрібно більше енергії, ніж ми можемо отримати від одного сервера, ми можемо розділити бази даних між декількома серверами. Ми також можемо розподілити навантаження географічно, ставлячи сервери в Азії чи Європі, щоб бути ближче до клієнтів.
Простіша налаштування продуктивності для кожного клієнта. Якщо деякі клієнти використовують різні функції або звіти, ми можемо створити спеціалізований набір індексів або індексованих представлень саме для цих клієнтів, не збільшуючи розмір даних для кожного. Зрозуміло, тут є певний ризик - дозволяючи розрізняти схеми між клієнтами, ми просто зробили наш розгортання коду трохи більш ризикованим, а наше управління продуктивністю ускладнило.
Простіше управління безпекою. Поки ми належним чином заблокували безпеку з одним користувачем на базу даних, нам не доведеться турбуватися про доступ клієнта X до даних клієнта Y. Однак якщо ми просто використовуємо єдиний логін для всіх, то ми справді не вирішили цю проблему.
Більш легке обслуговування вікон. У глобальній обстановці, де клієнти розкидані по всьому світу, простіше приймати клієнтів в автономному режимі для обслуговування, якщо ми можемо це робити в групах чи зонах.
Який із вас підходить?
Немає правильного вибору: ви повинні знати сильні та слабкі сторони своєї компанії. Візьмемо для прикладу двох моїх клієнтів.
Компанія A відмінна в налаштуванні апаратної продуктивності. Вони справді дуже хороші в тому, щоб вивести останні апаратні показники з обладнання, і вони не проти замінити апаратне забезпечення SQL Server на 12-18-місячному циклі. (Вони оновлюють веб-сервери кожні 4-6 місяців!) Їх ахіллесова п’ята - це надзвичайні вимоги дотримання та безпеки. Вони мають неймовірні потреби в аудиті, і їм просто простіше реалізовувати пуленепробивні елементи управління на одному сервері, єдиній базі даних, ніж керувати цими вимогами у тисячах баз даних на десятках серверів. Вони обрали одну базу даних, один сервер, багато клієнтів.
Компанія 2 відмінна в практиці розвитку. Управління змінами схем та розгортанням коду у тисячах баз даних для них просто не є проблемою. У них є клієнти по всьому світу, і вони цілодобово обробляють транзакції кредитними картками для цих клієнтів. Їм потрібна можливість географічного поширення навантаження, і вони не хочуть замінювати сервери по всьому світу кожні 12-18 місяців. Вони обрали по одній базі даних для кожного клієнта, і це окупається, коли вони починають розміщувати сервери SQL в Азії та Європі для своїх офшорних клієнтів.