模式迁移:PostgreSQL 中的一对多、多对多
schema migration: one-to-many, many-to-many in PostgreSQL
背景
在MySQL中,我需要用两个tables建模一对多,用[=26=建模多对多]三个tables,如果我想保持标准化tables.
我正在研究向 PostgreSQL 的迁移,令人惊讶的是,它允许 vector 甚至 multidimensional vector 字段!
问题
一对多和多对多在PostgreSQL[中的规范映射是什么?
是一对多只是一个table与矢量场?
是否有规范的方法来建模 多对多 还是取决于情况(比如我需要查询的方式)?
使用数组字段有什么注意事项吗?
在 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),
...
);
背景
在MySQL中,我需要用两个tables建模一对多,用[=26=建模多对多]三个tables,如果我想保持标准化tables.
我正在研究向 PostgreSQL 的迁移,令人惊讶的是,它允许 vector 甚至 multidimensional vector 字段!
问题
一对多和多对多在PostgreSQL[中的规范映射是什么?
是一对多只是一个table与矢量场?
是否有规范的方法来建模 多对多 还是取决于情况(比如我需要查询的方式)?
使用数组字段有什么注意事项吗?
在 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),
...
);