Nhiều người thuê - cơ sở dữ liệu duy nhất so với nhiều cơ sở dữ liệu


20

Chúng tôi có một số khách hàng, có hệ thống chia sẻ một số chức năng, nhưng cũng có mức độ đa dạng khá cao. Số lượng khách hàng đang tăng lên - luôn luôn là một điều lành mạnh! - và sự đa dạng giữa các doanh nghiệp của họ cũng đang tăng lên.

Hiện tại, có một trang web duy nhất của ASP.Net (Biểu mẫu web) (trái ngược với dự án web), có các thư mục phụ cho mỗi người thuê, với các trang không chuẩn của người thuê đó. Có một dự án mô hình riêng biệt, liên quan đến truy cập cơ sở dữ liệu và logic kinh doanh.

Điều nào là thích hợp hơn - và quan trọng nhất là tại sao - giữa việc có (a) 1 cơ sở dữ liệu cho mỗi khách hàng, chỉ có các tính năng được liên kết với khách hàng đó; hoặc (b) một cơ sở dữ liệu được chia sẻ bởi tất cả các khách hàng, trong đó chỉ một tập hợp con của các bảng được sử dụng bởi bất kỳ một khách hàng nào.

Những mối quan tâm chính trong doanh nghiệp đã qua:

  • bảo trì nhiều tài sản - sao lưu, kiểm soát phiên bản và tương tự
  • thúc đẩy tái sử dụng càng nhiều càng tốt

Làm thế nào bạn sẽ đảm bảo những mối quan tâm này được giải quyết, giải pháp nào là thích hợp hơn, và tại sao? (Tôi cũng đã tổng hợp các câu trả lời cho các câu hỏi tương tự)


Có khả năng nào điều này sẽ chuyển sang môi trường đám mây PaaS như Azure không? Nếu vậy, bạn cũng sẽ muốn xem xét các thực tiễn tốt nhất cho môi trường. Lần trước tôi đã xem xét, MS đã đề xuất nhiều cơ sở dữ liệu cho phần mềm đa năng trên Azure.
Harper Shelby

Cam ơn vi đa hỏi. Tôi đã tự hỏi những điều tương tự, nhưng không thể đưa vào định dạng câu hỏi một cách hùng hồn như bạn.
MathAttack

Bạn nên đọc loạt blog nhiều người thuê của Ayende. Anh ấy làm cho một số điểm rất tốt về cơ sở dữ liệu đa vs đơn.
Sebazzz

Câu trả lời:


12

10

Nếu bạn đang sử dụng SQL Server, hãy sử dụng một cơ sở dữ liệu nhưng sử dụng lược đồ. Sử dụng dbo cho các công cụ chung cho tất cả các máy khách và tạo một lược đồ cho từng máy khách và tạo lược đồ mặc định cho người dùng từ máy khách đó. Bây giờ bạn có thể có một đối tượng chung (giả sử một getB lí Proc) trong lược đồ dbo và một đối tượng tùy chỉnh cho máy khách trong lược đồ của chúng có cùng tên.


+1 Điều này cũng sẽ cho phép bạn tránh phải định cấu hình MSDTC và đảm nhận chi phí liên kết (cam kết hai pha)
brian

Và hy vọng bạn tránh được cái bẫy của việc có các cột như CustomField1 qua CustomField30 và / hoặc có bảng như ngân sách, BudgetEx, BudgetCustom, BudgetCustomerName, BudgetAnotherCustomerName vv
jfrankcarr

Có một lớp truy cập dữ liệu hiện có sử dụng nhiều quy trình được lưu trữ - 190 bảng, 5 quy trình được tạo mã cho mỗi bảng, cộng với một số tùy chỉnh - trong khi mục tiêu trung hạn là giới thiệu Entity Framework, sẽ cần phải sao chép lưu trữ thủ tục cho mỗi lược đồ?
RichardW1001

@ RichardW1001: phụ thuộc. bạn có thể tạo SQL động trong sp, để làm cho nó chung chung, nhưng điều đó tất nhiên phụ thuộc vào chúng có ít nhất một cấu trúc tương tự nhau. Một sự thay thế khả dĩ cho sql động, sẽ là Từ đồng nghĩa , thật không may, theo tôi hiểu, chúng là hệ thống rộng và không có trong một giao dịch, do đó không phù hợp để sử dụng đồng thời với các giá trị khác nhau.
jmoreno

Nếu chúng tôi sử dụng nhiều lược đồ, sử dụng Mã EF Đầu tiên, liệu có thể di chuyển tất cả các lược đồ sang phiên bản mới nhất sau khi hệ thống hoạt động không?
Yashvit

4

Vì cơ sở dữ liệu và chức năng của khách hàng đang chuyển hướng, nên điều đó có nghĩa là tại một thời điểm, chúng sẽ trở thành các hệ thống khác nhau, vì vậy trong trường hợp này tôi sẽ đề xuất các hệ thống riêng biệt vì chi phí duy trì các tùy chỉnh cho mỗi khách hàng sẽ lớn hơn lợi ích của một khách hàng hệ thống cơ sở dữ liệu.

Các hệ thống cơ sở dữ liệu duy nhất là tốt nhất khi các thay đổi giữa các khách hàng khác nhau chỉ là cấu hình chứ không phải là các tính năng bổ sung cho mỗi khách hàng.


Bạn có đề xuất gì về cách quản lý chức năng chung với nỗi đau tối thiểu?
RichardW1001

1
Trong hệ thống kiểm soát phiên bản của bạn, hãy duy trì một đầu cho ứng dụng cốt lõi và tạo một nhánh chính cho mỗi khách hàng, với các nhánh phụ cho các tính năng mới mà họ cần duy trì. Phát triển các tính năng cụ thể của khách hàng trong các chi nhánh, với các tùy chọn để cập nhật trung kế, v.v. Sau đó, bạn có thể dễ dàng quay vòng các môi trường cụ thể của khách hàng bất cứ khi nào bạn cần
Stephen Senkomago Musoke

3

Bạn đang thiếu một số mối quan tâm. Vấn đề sẽ đi kèm với sự tăng trưởng. Nếu bạn có thể cho rằng một ngày nào đó bạn sẽ phát triển lớn hơn một máy chủ DB - một cơ sở dữ liệu phức tạp chắc chắn sẽ khiến bạn đau đầu. Trừ khi bạn đầu tư vào kiến ​​trúc trước. Nhưng đó cũng là bước đắt đỏ)

Vì vậy, đừng quên rằng nó rẻ hơn nhiều lần và dễ dàng nhân rộng ra một vài cơ sở dữ liệu khác nhau, so với những cơ sở dữ liệu khổng lồ)


Bạn có bất kỳ dữ liệu xác nhận sự dễ dàng mở rộng? Nếu vậy, nó sẽ làm cho một trường hợp rất hấp dẫn. Bạn có thể giải thích về những mối quan tâm còn thiếu khác? Tôi đang cố gắng xây dựng một cuộc tranh luận ở cả hai phía càng tốt.
RichardW1001

1

Một lĩnh vực mà tôi chưa thấy giải quyết trong các câu trả lời là các vấn đề với việc bảo mật chính xác ứng dụng DB nhiều bên thuê. Các ứng dụng nhiều người thuê phải được thiết kế rất cẩn thận để tránh các vấn đề bảo mật. Hầu hết các Cơ sở dữ liệu và ứng dụng cung cấp một số, nhưng không tách biệt hoàn toàn - thường có các cách để trực tiếp hoặc gián tiếp suy ra dữ liệu trên các lược đồ DB. Và khá nhiều tài nguyên được chia sẻ (nhật ký và các tệp khác, bảng DBA, con trỏ ...) ít nhất có thể dẫn đến các cuộc tấn công từ chối dịch vụ dễ dàng đối với người thuê khác và thường là nhiều hơn nữa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.