Estoy trabajando en una aplicación que recopila datos de tarjetas inteligentes. Quiero poder ejecutar la aplicación como un servicio web para múltiples cuentas de clientes. La pregunta es, ¿debería crear una base de datos separada para cada cuenta o debería diseñar una única base de datos que contenga todos los datos de las cuentas? En primer lugar, pensé que una base de datos única era la respuesta obvia, pero resulta que el AccountID
tiene que ser utilizado en todas partes, en tablas, índices, restricciones, consultas, verificaciones, etc.¿Bases de datos individuales o separadas para cuentas de clientes separadas?
En esta aplicación, no hay un solo byte de datos que se va a compartir entre cuentas.
En primer lugar, vamos a ver cómo una base de datos independiente para una cuenta se vería:
CREATE TABLE CardHolder (
CardHolderID int, -- primary key
CardHolderUniqueName nvarchar(30));
CREATE TABLE SmartCard (
SmartCardID int, -- primary key
CardHolderID int,
CardUniqueName nvarchar(30));
A esto se añade un par de restricciones únicas,
ALTER TABLE CardHolder ADD CONSTRAINT UQ_CardHolderName UNIQUE (CardHolderUniqueName);
ALTER TABLE SmartCard ADD CONSTRAINT UQ_CardName UNIQUE (CardUniqueName);
Ahora, si pongo todo en una base de datos , significa que varias cuentas podrían manejar los mismos CardHolders y SmartCards, pero las cuentas no deberían ver los datos de los demás. Debido a esto, una SmartCard es única dentro de una cuenta, pero no dentro de toda la base de datos. Por lo tanto, cada restricción debe incluir un 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);
En el actual DB, habrá un montón de más tablas, columnas y varios índices (para el listado de expirydate etc, etc) y la columna de AccountID tiene que ser incluido en todas partes .
Parece un poco abarrotado para mí, primero poner todas las cuentas en una única base de datos, y luego separarlas teniendo una columna AccountID en cada tabla y casi cada restricción e índice. También necesitaría encontrar o inventar algún tipo de seguridad a nivel de fila para evitar que los usuarios accedan a los datos de otras cuentas. Entonces, ¿tengo una excusa válida para crear una base de datos separada para cada cuenta, o los "diseñadores de bases de datos reales" siempre guardan todo en una sola base de datos?
Marcado como respuesta, porque su enlace me proporcionó la mayor información. Todavía no puedo decidir qué hacer. Comenzaré a diseñar una base de datos para varios inquilinos, porque es más fácil cambiar eso en DB aislados si cambio de opinión, que rediseñar DB aislados en un diseño de una base de datos. – Batibix
Ese enlace fue realmente genial. Aprendí mucho. Debería ser parte de un libro sobre la construcción de Saas que probablemente compraría. – racl101
Realmente desearía que publicaras el artículo aquí, porque ahora es una respuesta muerta gracias a link-rot. –