模式迁移:PostgreSQL 中的一对多、多对多

schema migration: one-to-many, many-to-many in PostgreSQL

背景

在MySQL中,我需要用两个tables建模一对多,用[=26=建模多对多]三个tables,如果我想保持标准化tables.

我正在研究向 PostgreSQL 的迁移,令人惊讶的是,它允许 vector 甚至 multidimensional vector 字段!

问题

一对多多对多PostgreSQL[中的规范映射是什么?

在 PostgreSQL 中,您通常应该坚持关系建模,就像您目前在 MySQL.

中使用的那样

PostgreSQL 的数组很有用,但不应该是您数据建模的首选,原因有很多:

  • 数组的粗取、锁定和写入粒度;
  • 缺乏外键目标支持(至少在 9.4 中是这样;9.5 可能添加了数组 FK 支持,但由于性能问题而被放弃);
  • 客户端库和应用程序的有限支持

值得注意的是,更新数组时,必须更新整个数组,重写整个数组。由于 MVCC,无法进行就地更新。

当您构建复杂的查询时,数组非常有用,并且对于您出于性能原因想要创建物化视图的某些非规范化任务。它们应该而不是是您建模权威数据存储的首选。

PostgreSQL 中一对多和多对多的规范映射与任何关系数据库完全相同:

1:米

CREATE TABLE parent (
  parent_id integer primary key,
  ...
);

CREATE TABLE child (
  child_id integer primary key,
  parent_id integer not null references parent(parent_id),
  ...
);

米:n:

CREATE TABLE m(
   m_id integer primary key,
   ...
);

CREATE TABLE n(
   n_id integer primary key,
   ...
);

CREATE TABLE m_n (
   m_id integer references m(m_id),
   n_id integer references n(n_id),
   PRIMARY KEY(m_id, n_id),
   ...
);