Мульти-оренда - одна база даних проти декількох баз даних


20

У нас є декілька клієнтів, системи яких поділяють певну функціональність, але також мають достатню ступінь різноманітності. Зростає кількість клієнтів - завжди здорова річ! - і різноманітність між їхніми підприємствами також збільшується.

В даний час існує єдиний веб-сайт ASP.Net (Web Forms) (на відміну від веб-проекту), на якому є підпапки для кожного орендаря, з нестандартними сторінками цього орендаря. Існує окремий модельний проект, який стосується доступу до бази даних та логіки бізнесу.

Що є кращим - а головне, чому - між наявністю (а) 1 бази даних на кожного клієнта, з лише функціями, пов'язаними з цим клієнтом; або (b) єдину базу даних, яку поділяють усі клієнти, де будь-який клієнт використовує лише підмножину таблиць.

Основні проблеми в бізнесі закінчуються:

  • обслуговування декількох активів - резервного копіювання, контролю версій тощо
  • максимально сприяючи повторному використанню

Як би ви забезпечили вирішення цих проблем, яке рішення є кращим і чому? (Я також збираю відповіді на подібні запитання)


Чи є ймовірність, що це переміститься в хмарне середовище PaaS, як Azure? Якщо так, то вам захочеться також розглянути кращі практики для навколишнього середовища. Востаннє, коли я подивився, MS рекомендував декілька баз даних для багатостороннього програмного забезпечення на Azure.
Харпер Шелбі

Спасибі за питання. Я цікавився подібним речам, але не зміг поставити такий формат питань так красномовно, як ви.
MathAttack

Ви повинні прочитати серію блог «Ayende» про багаторічні орендарі. Він робить дуже хороші моменти щодо мульти-проти єдиної бази даних.
Sebazzz

Відповіді:


12

Ось основні моменти досліджень з інших джерел (спочатку з редакції 2 питання ):


10

Якщо ви використовуєте SQL Server, використовуйте одну базу даних, але використовуйте схеми. Використовуйте dbo для речей, загальних для всіх клієнтів, і створіть схему для кожного клієнта та зробіть схему за замовчуванням для користувачів цього клієнта. Тепер ви можете мати загальний об'єкт (скажімо, getBudget proc) в схемі dbo та індивідуальний для клієнта в їх однойменній схемі.


+1 Це також дозволить вам уникнути необхідності конфігурувати MSDTC та взяти на себе пов'язані накладні витрати (двофазні коміти)
Брайан

І, сподіваємось, ви уникнете пастки, коли стовпці типу CustomField1 через CustomField30 та / або мати такі таблиці, як бюджет, BudgetEx, BudgetCustom, BudgetCustomerName, BudgetAbodyCustomerName тощо
jfrankcarr

Існує існуючий рівень доступу до даних, який використовує багато збережених процедур - 190 таблиць, 5 процедур, згенерованих кодом на таблицю, а також деякі спеціальні - в той час як середньострокова мета полягає в запровадженні Entity Framework, чи буде необхідність копіювання збережених процедури для кожної схеми?
RichardW1001

@ RichardW1001: залежить. Ви можете робити динамічний SQL в СП, щоб зробити його загальним, але це, звичайно, залежить від того, що вони мають хоча б дещо схожу структуру. Можливою альтернативою для динамічного sql були б синоніми , на жаль, наскільки я їх розумію, вони є загальносистемними та не містяться в транзакції, тому не підходять для одночасного використання з різними значеннями.
jmoreno

Якщо ми використовуємо декілька схем, використовуючи код EF Спочатку, чи вдасться перенести всі схеми до останньої версії після того, як система почне працювати в реальному часі?
Яшвіт

4

Оскільки бази даних і функціональність клієнтів розходяться, то це означає, що в один момент вони виявляться різними системами, тому в цьому випадку я рекомендую окремі системи, оскільки витрати на підтримку налаштувань для кожного клієнта будуть переважати від переваг одного система баз даних.

Єдині системи баз даних найкращі, коли зміни між різними клієнтами - це лише конфігурація, але не додаткові функції для кожного клієнта.


Якою буде ваша пропозиція щодо управління загальною функціональністю з мінімальним болем?
RichardW1001

1
У вашій системі управління версіями підтримуйте головний додаток та створюйте основну гілку для кожного клієнта з підгалузями для нових функцій, які вони потребують для підтримки. Розробіть особливості клієнта у галузях, з можливістю оновити багажник тощо. Потім ви можете легко прокручувати специфічні для клієнтів середовища, коли вони вам знадобляться
Стівен Сенкомаго Мусоке

3

Вам не вистачає певних проблем. Проблеми будуть рости. Якщо ви можете припустити, що коли-небудь ви зросте більше, ніж один сервер БД - одна складна база даних напевно викличе у вас головний біль. Якщо ви не заздалегідь вкладете в архітектуру. Але це також дорогий крок)

Тож, не забувайте, що масштабувати декілька різних баз даних, ніж величезні, це і в багато разів дешевше, і в багато разів)


Чи є у вас дані, які підтверджують простоту масштабування? Якщо так, то це зробить дуже вагомий випадок. Не могли б ви детальніше розглянути інші недоліки? Я намагаюся побудувати якомога повніший аргумент з обох сторін.
RichardW1001

1

Однією з областей, яку я не бачив у відповідях, є проблеми з правильним захистом програми для багатообіцяних БД. Додатки для орендарів повинні бути дуже ретельно розроблені, щоб уникнути проблем безпеки. Більшість баз даних та додатків забезпечують певну, але не повну ізоляцію - зазвичай існують способи прямого чи опосередкованого висновку даних у схемах БД. І досить багато спільних ресурсів (журнали та інші файли, таблиці DBA, курсори ...), які, принаймні, можуть призвести до легких атак на відмову від служби на інших орендарів і, як правило, набагато більше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.