Я работаю над приложением, которое собирает данные с смарт-карт. Я хочу, чтобы иметь возможность запускать приложение в качестве веб-службы для нескольких учетных записей клиентов. Вопрос в том, должен ли я создать отдельную базу данных для каждой учетной записи или я должен создать единую базу данных, содержащую данные всех учетных записей? Во-первых, я думал, что единственная база данных является очевидным ответом, но это приводит к тому, что AccountID
нужно использовать практически везде, в таблицах, индексах, ограничениях, запросах, проверках и т.д.
В этом приложении нет ни одного байта данных, который должен быть разделен между учетными записями.
Сначала рассмотрим, как будет выглядеть отдельная база данных для одной учетной записи:
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30) );
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30) );
Добавьте к этому несколько ограничений уникальности,
ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName);
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName);
Теперь, если я помещаю все в одну базу данных, это означает, что несколько учетных записей могут обрабатывать одни и те же карты CardHolders и SmartCards, но учетные записи не должны видеть данные друг друга. Из-за этого смарт-карта уникальна в учетной записи, но не во всей базе данных. Таким образом, каждое ограничение должно включать идентификатор Account,
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);
В фактической БД будет загружено больше таблиц, столбцов и нескольких индексов (для перечисления expirydate и т.д.), а столбец AccountID должен быть включен везде.
Кажется, я немного захламлен, сначала помещаю все учетные записи в одну базу данных, а затем разделяя их, имея столбец AccountID в каждой таблице и почти каждое ограничение и индекс. Мне также нужно было бы найти или изобрести какую-нибудь систему безопасности на уровне строк, чтобы пользователи не могли получать доступ к данным других учетных записей. Итак, есть ли у меня действительное оправдание для создания отдельной базы данных для каждой учетной записи или "реальные дизайнеры db" всегда хранят все в одной базе данных?