Гаразд, розбимо його:
- Як будуються з'єднання між двома таблицями на кількох базах даних? (Корисний приклад коду тут).
Це досить просто. Об'єкти SQL містять місця від однієї до чотирьох конвенцій іменування:
Ім'я сервера.дадабази.менне ім'я.таблетки
Якщо всі ваші таблиці знаходяться на одному сервері в одній базі даних, з тим самим власником / схемою, ви можете просто проігнорувати перші три частини та використовувати те, до чого ви найбільше звикли:
Select a.*,b.* from
tableA a inner join
tableB b on a.col1=b.col1
Якщо одна з ваших таблиць знаходиться в іншій базі даних, і обидві використовують схему за замовчуванням для своїх баз даних, ви просто додасте базу даних до другої таблиці:
Select a.*,b.* from
tableA a inner join
databaseC..tableB b on a.col1 = b.col1
Якщо ви знаходитесь у третій базі даних, відрізняється від будь-якої з запитів, ви використовуєте обидва імена бази даних явно:
Select a.*,b.* from
databaseD..tableA a inner join
databaseC..tableB b on a.col1 = b.col1
Якщо ви користуєтесь різними схемами та / або власниками, ви можете додати їх у:
Select a.*,b.* from
databaseD.john.tableA a inner join
databaseC.accounting.tableB b on a.col1 = b.col1
І нарешті, якщо ви дуже обережно ставитесь до цього і маєте дуже вагомі причини, ви можете приєднатися до (зазвичай невеликої) таблиці на іншому сервері:
Select a.* from
databaseD.john.TableA a inner join
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
- Коли настав час вийти за межі налаштування 1 сервер бази даних / 1? Наскільки звичайно це потрібно робити? Чи є якісь спеціальні стратегії відстеження, які таблиці є в якій базі даних?
Я поєднаю цих двох, бо вони йдуть разом. Ви майже завжди добре починати з припущення, що однієї бази даних одного сервера достатньо, поки ваші дизайнерські / бізнес / технічні обмеження не змусять вас використовувати більше.
Отже, щоб відповісти на ваше друге запитання спочатку, оскільки у вас, як правило, є причина у наявності окремих баз даних, це може бути досить очевидно з того, щоб знати дизайн вашої системи, де щось є.
Про те, коли / чому потрібно вийти за межі єдиної бази даних. Зазвичай це поєднання правил бізнесу, політики та / або технічних причин.
Наприклад, там, де я працюю, ми маємо 16 баз даних, що поширюються на 4 сервери. У нас є MainDB, ImageDB, referencetableDB, HighvolumeTransactionDB, ReportingDB, StagingDB, ProcessingDB, ArchiveDB, FinancialDB. Наведіть кілька прикладів того, чому вони різні:
- FinancialDB, конфіденційна інформація
- База даних DB, специфічні різні вимоги до зберігання та відновлення
- ReferenceDB, низька транзакція, висока читання
- ReportingDB, дуже високо зчитуваний, потребує відновлення / тиражування в різних інших середовищах, на відміну від багатьох інших даних
- StagingDB, нічого постійного, просто посилений темпдб, над яким ми маємо більше контролю
- MainDB, інтерфейси з усіма іншими БД, але потребує диференціальних резервних копій, так що ... ми розділили
- Таблиці HighVolumeTransaction (які є відносно перехідними) до власних БД, щоб зберегти розумний розмір резервної копії.
- Архів, безліч одних і тих же даних з Main та Reporting, але з більш тривалими термінами зберігання та складнішими запитами, що копаються вглиб даних. Якщо це все-таки поєднувалося з Main / Reporting, це призведе до погіршення нашої системи.
• Чи потрібно знати код програми, що одна чи більше баз даних поширюються на декілька серверів? Якщо ні, то на якому рівні фільтруються запити?
У широкому сенсі вони, мабуть, так і роблять. Як мінімум вони повинні знати, на який сервер вони вказують у рядку підключення до бази даних. Обробка, звітність, основна тощо.
Звідти їм потрібен контекст бази даних для виконання під. Як правило, це було б найбільш використовуваним для програми, можливо навіть оригінальним з однієї бази даних / одного серверного дня програми. У МОЖЛИВИМО додаток явно перемикає контекст бази даних під час кожного дзвінка, але це дуже важко налаштувати базу даних, не змінюючи додаток.
Звичайний (або принаймні МОЙ звичайний) підхід - це завжди доступ через одну або, можливо, дві основні бази даних.
Потім створіть перегляди в інших базах даних за необхідності в поєднанні з взаємодією з базою даних через збережені процедури.
Отже, для ілюстрації:
Скажімо, ви хочете отримати демографічну інформацію Клієнта, Дані про продажі та Кредитний баланс, і це поширюється на три таблиці спочатку в MainDB.
Отже, ви пишете дзвінок зі свого додатка:
Select c.ClientName, c.ClientAddress, s.totalSales,f.CreditBlance from
Clients c join Sales s on c.clientid = s.clientid inner join AccountReceivable f on
c.clientid=f.clientid where c.clientid = @clientid
Дивовижно. Однак тепер, коли ми змінюємо стовпець або перейменовуємо / переміщуємо таблицю, вам доведеться оновити код програми. Отже, замість цього ми робимо дві речі:
Створення клієнтів, продажів, перегляди рахунків на рахунку (ви б не використовували Select *, але я демонструю тут)
Use MainDB
GO
Create view v_Clients as select * from Clients
Create view v_Sales as select * from Sales
Create view v_AccountReceivable as select * from AccountReceivable
Go
Тоді ми також створили б збережену процедуру, spGetClientSalesAR
Create proc spGetClientSalesAR @clientID int
as
Select c.ClientName as ClientName,
c.ClientAddress as ClientAddress,
s.totalSales as TotalSales,
f.CreditBlance as CreditBalance
from
v_Clients c join v_Sales s
on c.clientid = s.clientid
inner join v_AccountReceivable f
on c.clientid=f.clientid
where c.clientid = @clientid
І попросіть ваш додаток так.
Тепер, поки я не змінюю інтерфейс цього збереженого процесору, я можу зробити все, що мені потрібно зробити, щоб зробити резервну базу даних для збільшення чи зменшення масштабу.
В крайньому випадку я навіть міг зробити свій старий MainDB лише купою обстріляних зберігаються процедур і поглядів таким чином, що під тими створеними нами переглядами виглядав так:
Create view v_Clients as select * from ServerX.DatabaseY.dbo.Clients
Create view v_Sales as select * from ServerQ.DatabaseP.dbo.Sales
Create view v_AccountReceivable as select * from ServerJ.DatabaseK.dbo.AccountReceivable
І ваш додаток ніколи не дізнається різницю (якщо припустити швидку передачу даних та чітко сформовані дані між іншим).
Очевидно, що це надзвичайно, і я брешу, якби я сказав, що все було заплановано таким чином, але використання збережених процедур / поглядів, навіть якщо ви робите це під час рефакторингу, дозволить вам отримати велику гнучкість, оскільки ваш додаток зростає зі своєї скромної однієї бази даних / одного сервера початок.