我正在为多个客户使用设计应用程序。我最终使用每个客户布局的模式创建单个数据库设置,如下所示:
CREATE TABLE public.companies
(
id serial NOT NULL,
name long_name NOT NULL,
registration_number character(11),
address character varying(256),
CONSTRAINT "CompaniesPrimaryKey" PRIMARY KEY (id )
);
CREATE TABLE public.banks(.. );
CREATE TABLE public.calendars(.. );
-- Schema definition - none of the tables have company_id key
-- company_1 schema
CREATE TABLE company_1.employees
(
id serial NOT NULL,
first_name character varying(30),
middle_name character varying(30),
last_name character varying(50),
bank_id integer,
CONSTRAINT employees_pkey PRIMARY KEY (id )
);
CREATE TABLE company_1.contracts
(
id serial NOT NULL,
employee_id integer,
calendar_id integer,
CONSTRAINT contracts_pkey PRIMARY KEY (id )
)
-- company_2 schema same as schema company_1
-- and so on ...
在每次讨论中,我都有一些关于数据库设计的争论,有人说它有问题,但是没有人可以说什么,只是直觉。
它有什么问题吗?这个设计的真正警告是什么?
答案 0 :(得分:1)
问题是,在架构更改的情况下,您必须升级所有这些,以便应用程序找到一致的结构。您的升级脚本必须是所有这些脚本的原子。
如果这些表位于同一个数据库中,因为您可以将升级脚本包装在事务中,那么该数据库应该不会太糟糕。
另一方面,如果您使用每个客户数据库,并且RDBMS不支持每个事务多个数据库,那么您可能会升级某些客户,同时“崩溃”其他客户。
此外,如果您愿意,也不能让一位客户轻松地从其他客户那里阅读(例如,您可能希望为所有客户提供由所有客户的数据填充的自动完成列表)。