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

时间:2015-04-16 01:51:10

标签: mysql postgresql schema database-migration

背景

在MySQL中,如果我想保留,我需要使用两个表进行一对多建模,使用三个表进行多对多建模规范化表格

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

问题

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

  • 一对多只是一个表,带有 vector 字段吗?

  • 是否有一种通用的方式来模拟多对多,还是取决于具体情况(比如我需要查询的方式)?

  • 是否有警告使用数组字段

1 个答案:

答案 0 :(得分:16)

在PostgreSQL中,你应该坚持使用关系建模,就像你目前在MySQL中使用一样。

PostgreSQL的数组很有用,但由于种种原因,它不应该是数据建模的首选:

  • 数组的粗略提取,锁定和写入粒度;
  • 缺少外键目标支持(至少在9.4中为真; 9.5可能添加阵列FK支持,但由于性能问题而被删除);
  • 客户端库和应用程序中的有限支持

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

当您构建复杂查询时,以及出于性能原因要创建物化视图的一些非规范化任务时,阵列非常有用。他们应该是您对权威数据存储进行建模的首选。

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

1:M

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),
  ...
);

M: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),
   ...
);