Ok, hãy phá vỡ nó:
- Làm thế nào các liên kết được xây dựng giữa hai bảng trên nhiều cơ sở dữ liệu? (Một ví dụ mã ở đây sẽ hữu ích).
Việc này thật thẳng thắn. Các đối tượng SQL có bất kỳ vị trí nào từ quy ước đặt tên một đến bốn phần:
Máy chủ tên.databasename.schemaname.tablename
Nếu tất cả các bảng của bạn nằm trên cùng một máy chủ trên cùng một cơ sở dữ liệu, với cùng một chủ sở hữu / lược đồ, bạn có thể bỏ qua ba phần đầu tiên và sử dụng những gì bạn sử dụng nhiều nhất để:
Select a.*,b.* from
tableA a inner join
tableB b on a.col1=b.col1
Nếu một trong các bảng của bạn nằm trong một cơ sở dữ liệu khác nhau và cả hai đều sử dụng lược đồ mặc định cho cơ sở dữ liệu của chúng, thì bạn chỉ cần thêm cơ sở dữ liệu vào bảng thứ hai:
Select a.*,b.* from
tableA a inner join
databaseC..tableB b on a.col1 = b.col1
Nếu bạn tình cờ ở trong cơ sở dữ liệu thứ ba khác với cơ sở dữ liệu bạn đang truy vấn, bạn sử dụng rõ ràng cả hai tên cơ sở dữ liệu:
Select a.*,b.* from
databaseD..tableA a inner join
databaseC..tableB b on a.col1 = b.col1
Nếu bạn kết thúc bằng cách sử dụng các lược đồ và / hoặc chủ sở hữu khác nhau, bạn có thể thêm các lược đồ đó vào:
Select a.*,b.* from
databaseD.john.tableA a inner join
databaseC.accounting.tableB b on a.col1 = b.col1
Và cuối cùng, nếu bạn rất cẩn thận về nó và có một lý do rất chính đáng, bạn có thể tham gia một bảng (thường là nhỏ) trên một máy chủ khác:
Select a.* from
databaseD.john.TableA a inner join
ATLANTA.databaseC.accounting.tableB b on a.col1 = b.col1
- Khi nào là thời gian để vượt ra ngoài thiết lập 1 cơ sở dữ liệu / 1 máy chủ? Làm thế nào phổ biến là cần phải làm điều này? Có chiến lược đặc biệt nào để theo dõi các bảng trong cơ sở dữ liệu nào không?
Tôi sẽ kết hợp cả hai vì chúng đi cùng nhau. Bạn hầu như luôn luôn ổn để bắt đầu với giả định rằng một cơ sở dữ liệu một máy chủ là đủ cho đến khi các ràng buộc về thiết kế / kinh doanh / kỹ thuật của bạn buộc bạn phải sử dụng nhiều hơn.
Vì vậy, để trả lời câu hỏi thứ hai của bạn trước, vì bạn thường có lý do để có cơ sở dữ liệu riêng biệt, nên việc tìm hiểu thiết kế hệ thống của bạn ở đâu đó là điều khá rõ ràng.
Khi nào / tại sao cần phải vượt ra ngoài một cơ sở dữ liệu. Thông thường, đó là sự pha trộn của các quy tắc kinh doanh, chính trị và / hoặc lý do kỹ thuật.
Chẳng hạn, nơi tôi làm việc, chúng tôi có 16 cơ sở dữ liệu trải rộng trên 4 máy chủ. Chúng tôi có MainDB, ImageDB, ReferenceencetableDB, HighvolumeTransactionDB, ReportingDB, StagingDB, TreatmentDB, ArchiveDB, FinancialDB. Để đưa ra một số ví dụ về lý do tại sao chúng khác nhau:
- FinancialDB, thông tin nhạy cảm
- Hình ảnh DB, yêu cầu lưu trữ và phục hồi cụ thể khác nhau
- ReferenceDB, giao dịch thấp, đọc cao
- Báo cáoDB, đọc rất cao, cần được khôi phục / sao chép sang nhiều môi trường khác không giống như nhiều dữ liệu khác
- StagingDB, không có gì là vĩnh viễn, chỉ là một tempdb được tăng cường mà chúng ta có quyền kiểm soát nhiều hơn
- MainDB, giao diện với tất cả các DB khác nhưng cần sao lưu vi sai nên ... chúng tôi chia ra
- Các bảng HighVolumeTransaction, (tương đối thoáng qua), đến DB riêng của chúng để giữ cho kích thước sao lưu hợp lý.
- Lưu trữ, Rất nhiều dữ liệu giống nhau từ Chính và Báo cáo, nhưng với thời gian lưu giữ lâu hơn và các truy vấn khó truy cập sâu hơn vào dữ liệu. Nếu điều này vẫn được kết hợp với Chính / Báo cáo, nó sẽ làm hỏng hệ thống của chúng tôi.
• Mã ứng dụng có cần biết rằng một hoặc nhiều cơ sở dữ liệu được trải rộng trên nhiều máy chủ không? Nếu không, các yêu cầu được lọc ở cấp độ nào?
Theo nghĩa rộng, họ có thể làm. Tối thiểu họ cần biết máy chủ nào họ đang trỏ đến trong chuỗi kết nối cơ sở dữ liệu. Xử lý, báo cáo, chính, vv
Từ đó, họ cần một bối cảnh cơ sở dữ liệu để thực thi theo. Nói chung, đó sẽ là cái được sử dụng nhiều nhất cho ứng dụng, thậm chí có thể là cái ban đầu từ một cơ sở dữ liệu / một ngày máy chủ của ứng dụng. Bạn CÓ THỂ có ứng dụng chuyển đổi rõ ràng bối cảnh cơ sở dữ liệu trên mỗi cuộc gọi nhưng điều đó khiến cho việc điều chỉnh cơ sở dữ liệu mà không thay đổi ứng dụng rất khó khăn.
Cách tiếp cận thông thường, (hoặc ít nhất, thông thường của tôi), là luôn luôn truy cập thông qua một hoặc có thể hai cơ sở dữ liệu chính.
Sau đó tạo các khung nhìn vào các cơ sở dữ liệu khác khi cần thiết kết hợp với giao tiếp với cơ sở dữ liệu thông qua các thủ tục được lưu trữ.
Vì vậy, để minh họa:
Giả sử bạn muốn lấy thông tin nhân khẩu học, Dữ liệu bán hàng và Số dư tín dụng của Khách hàng và điều đó trải đều trên ba bảng ban đầu đều có trong MainDB.
Vì vậy, bạn viết một cuộc gọi từ ứng dụng của bạn:
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
Tuyệt vời. Tuy nhiên, bây giờ bất cứ khi nào chúng tôi thay đổi một cột, hoặc đổi tên / di chuyển bảng, bạn phải cập nhật mã ứng dụng. Vì vậy, thay vào đó chúng tôi thực hiện hai việc:
Tạo khách hàng, Bán hàng, Lượt xem tài khoản (bạn sẽ không sử dụng Chọn * nhưng tôi đang demo ở đây)
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
Sau đó, chúng tôi cũng sẽ tạo một thủ tục được lưu trữ, 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
Và có ứng dụng của bạn gọi đó.
Bây giờ miễn là tôi không thay đổi giao diện trên gói lưu trữ đó, tôi có thể làm bất cứ điều gì tôi cần làm với cơ sở dữ liệu phụ trợ để mở rộng hoặc mở rộng.
Cuối cùng, tôi thậm chí có thể làm cho MainDB cũ của mình chỉ là một loạt các thủ tục và khung nhìn được lưu trữ được bóc vỏ sao cho bên dưới các khung nhìn mà chúng ta tạo ra trông như thế này:
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
Và ứng dụng của bạn sẽ không bao giờ biết sự khác biệt, (giả sử các đường ống nhanh và dữ liệu được dàn dựng tốt trong số những thứ khác).
Rõ ràng đó là điều cực đoan và tôi sẽ nói dối nếu tôi nói mọi thứ được lên kế hoạch theo cách này, nhưng sử dụng các thủ tục / lượt xem được lưu trữ ngay cả khi bạn thực hiện trong khi tái cấu trúc sẽ cho phép bạn linh hoạt hơn khi ứng dụng của bạn phát triển từ một cơ sở dữ liệu / một máy chủ khiêm tốn của nó bắt đầu