架构迁移:PostgreSQL 中的一对多、多对多

Posted

技术标签:

【中文标题】架构迁移:PostgreSQL 中的一对多、多对多【英文标题】:schema migration: one-to-many, many-to-many in PostgreSQL 【发布时间】:2015-06-22 05:28:25 【问题描述】:

背景

mysql 中,如果我想保留 ,我需要用 两个表 建模一对多,用 三个表 建模多对多规范化表

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

问题

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

一对多是否只是一个表和一个vector字段?

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

对于使用 数组字段,是否有任何注意事项

【问题讨论】:

一般来说,你不应该仅仅因为 x 对多的关系而需要使用 arrays,尽管 arrays 当然可以以多种方式使用。通常,只需通过 外键 关系将它们连接起来。有什么理由不适合您的情况吗? 多对多模型的演示实现:***.com/questions/9789736/… 【参考方案1】:

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

【讨论】:

如果m_n 包含对m 的多个列引用,这是否可行?所以表定义将沿着m_id_1 integer references m(m_id), m_id_2 integer references m(m_id) ... 的行? @AustinCawley-Edwards 我不太明白,请尝试发布一个新问题并添加一个从您的新问题到此问题的链接,以帮助人们了解上下文。

以上是关于架构迁移:PostgreSQL 中的一对多、多对多的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中存储一对多或多对多关系的最佳方式是啥?

Laravel 5.3,MySQL,迁移中正确的外键设置(一对多,多对多)

MyBatis 详解(一对一,一对多,多对多)

postgresql 多对多映射返回错误

将表拆分为多对多关系:数据迁移

多对多的核心数据迁移