1

我正在为多个客户使用设计应用程序。我最终使用每个客户布局的架构创建了单个数据库设置,如下所示:

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 ...

在每次讨论中,我都有一些关于数据库设计的争论,有人说它有问题,但没有人能说什么,只是直觉。

它真的有什么问题吗?这种设计的真正警告是什么?

4

1 回答 1

1

问题是,如果模式发生变化,您必须升级所有这些,以便应用程序找到一致的结构。您的升级脚本对于所有这些都必须是原子的。

如果表在同一个数据库中,那应该不会太糟糕,因为您可以将升级脚本包装在事务中。

另一方面,如果您使用每个客户的数据库,并且 RDBMS 不支持每个事务有多个数据库,您可能会升级一些客户,同时“崩溃”其他客户。

此外,如果您愿意,您不能让一个客户轻松地从其他客户那里读取(例如,您可能希望为所有客户提供一个由所有客户的数据填充的自动完成列表)。

于 2013-01-27T11:46:06.203 回答