Tôi đang làm việc trên một ứng dụng thu thập dữ liệu từ các thẻ thông minh. Tôi muốn có thể chạy ứng dụng dưới dạng dịch vụ web cho nhiều tài khoản khách hàng. Câu hỏi đặt ra là, tôi có nên tạo một cơ sở dữ liệu riêng biệt cho mỗi tài khoản hay tôi nên thiết kế một cơ sở dữ liệu duy nhất chứa tất cả dữ liệu của tài khoản? Đầu tiên, tôi nghĩ rằng một cơ sở dữ liệu duy nhất là câu trả lời rõ ràng, nhưng kết quả là AccountID
phải được sử dụng ở mọi nơi, trong bảng, chỉ mục, ràng buộc, truy vấn, kiểm tra, v.v.Cơ sở dữ liệu đơn lẻ hoặc riêng biệt cho các tài khoản khách hàng riêng biệt?
Trong ứng dụng này, không có một byte dữ liệu được chia sẻ giữa các tài khoản.
Đầu tiên, chúng ta hãy nhìn vào một cơ sở dữ liệu riêng biệt cho một tài khoản sẽ trông như thế nào:
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30));
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30));
Thêm vào đó một vài ràng buộc duy nhất,
ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName);
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName);
Bây giờ, nếu tôi đặt tất cả mọi thứ trong một cơ sở dữ liệu , nó có nghĩa là một số tài khoản có thể xử lý cùng một CardHolders và SmartCards, nhưng các tài khoản sẽ không nhìn thấy dữ liệu của nhau. Bởi vì điều này, một SmartCard là duy nhất trong một tài khoản, nhưng không phải trong toàn bộ cơ sở dữ liệu. Vì vậy, mỗi chế phải bao gồm một AccountID,
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30),
AccountID int);
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30)
AccountID int);
ALTER TABLE CardHolder
ADD CONSTRAINT UQ_CardHolderName UNIQUE (AccountID, CardHolderUniqueName);
ALTER TABLE SmartCard
ADD CONSTRAINT UQ_CardName UNIQUE (AccountID, CardUniqueName);
Trong DB thực tế, sẽ có vô số bảng hơn, cột và một số chỉ số (niêm yết bởi expirydate etc etc) và cột AccountID phải được bao gồm ở khắp mọi nơi .
Dường như một chút lộn xộn với tôi, trước tiên đặt tất cả các tài khoản vào một cơ sở dữ liệu, sau đó tách chúng bằng cột AccountID trong mỗi bảng và chỉ về mọi ràng buộc và chỉ mục. Tôi cũng cần tìm hoặc phát minh một số loại bảo mật mức hàng để giữ cho người dùng truy cập dữ liệu của các tài khoản khác. Vì vậy, tôi có một lý do hợp lệ để tạo ra một cơ sở dữ liệu riêng biệt cho mỗi tài khoản, hoặc làm "nhà thiết kế db thực" luôn giữ mọi thứ trong một cơ sở dữ liệu duy nhất?
Được đánh dấu là câu trả lời vì liên kết của bạn đã cung cấp cho tôi nhiều thông tin nhất. Tôi vẫn không thể quyết định phải làm gì. Tôi sẽ bắt đầu thiết kế một DB cho nhiều người thuê, bởi vì nó dễ dàng hơn để thay đổi nó thành các DB bị cô lập nếu tôi thay đổi ý định, hơn là thiết kế lại các DB bị cô lập thành một thiết kế DB. – Batibix
Liên kết đó thực sự tuyệt vời. Tôi đã học được rất nhiều. Nó nên là một phần của một cuốn sách về xây dựng Saas mà tôi có thể mua. – racl101
Thực sự muốn bạn đăng thịt của bài viết đó ở đây, gây ra điều này bây giờ là một câu trả lời chết nhờ liên kết-thối. –