Pracuję nad aplikacją, która zbiera dane z kart inteligentnych. Chcę móc uruchomić aplikację jako usługę internetową dla wielu kont klientów. Pytanie brzmi, czy powinienem utworzyć osobną bazę danych dla każdego konta, czy też powinienem zaprojektować pojedynczą bazę danych przechowującą dane wszystkich kont? Po pierwsze pomyślałem, że jedna baza danych jest oczywistą odpowiedzią, ale powoduje, że AccountID
musi być używany niemal wszędzie, w tabelach, indeksach, ograniczeniach, zapytaniach, czekach itp.Pojedyncze lub oddzielne bazy danych dla oddzielnych kont klientów?
W tej aplikacji nie ma jeden bajt danych, które mają być współdzielone między kontami.
pierwsze, przyjrzyjmy się, jak będzie wyglądać oddzielne bazy danych dla jednego konta:
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30));
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30));
Dodajmy do tego kilku unikalności ograniczeń,
ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName);
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName);
Teraz, jeśli mogę umieścić wszystko w jednej bazie danych oznacza to, że kilka kont może obsługiwać te same CardHolders i SmartCards, ale konta nie powinny widzieć siebie nawzajem. Z tego powodu karta SmartCard jest unikalna na koncie, ale nie w całej bazie danych. Tak więc, każdy ograniczenie musi zawierać 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);
w rzeczywistej DB, nie będzie mnóstwo więcej tabel, kolumn i kilka indeksów (dla Zamieszczone przez expirydate etc etc), a kolumna identyfikator konta musi być włączone wszędzie .
Wydaje mi się, że jestem trochę zagracony, najpierw umieszczając wszystkie konta w pojedynczej bazie danych, a następnie rozdzielając je poprzez posiadanie kolumny AccountID w każdej tabeli i prawie każdym ograniczeniu i indeksie. Potrzebowałabym też znaleźć lub wymyślić jakieś zabezpieczenia na poziomie wiersza, aby uniemożliwić użytkownikom dostęp do danych innych kont. Czy mam uzasadnioną wymówkę dla tworzenia oddzielnej bazy danych dla każdego konta, czy też "prawdziwi projektanci db" zawsze przechowują wszystko w jednej bazie danych?
Oznaczono jako odpowiedź, ponieważ Twój link dostarczył mi najwięcej informacji. Nadal nie mogę zdecydować, co robić. Zacznę projektować jeden DB dla wielu lokatorów, ponieważ łatwiej jest zmienić to w izolowane bazy danych, jeśli zmienię zdanie, niż przeprojektowanie izolowanych baz danych w jeden projekt DB. – Batibix
Ten link był naprawdę świetny. Dużo się nauczyłem. Powinno to być częścią książki o budowie Saas, którą prawdopodobnie kupiłbym. – racl101
Naprawdę chciałbym, abyś wysłał tutaj mięso tego artykułu, ponieważ jest to teraz martwa odpowiedź dzięki link-rot. –