模拟多对多关系的最佳方式是什么

What the best way to model a many to many relationship

我正在尝试了解为以下关系建模的最佳方式:

我有一个名为 Contact 的 table,它包含使用 serial 字段和其他字段(如 namephone)唯一标识的联系人记录address 等等。

我还有一个名为 ProductInfo 的 table,它有几个字段,包括三个名为 AuthorDistributorPointOfContact 的字段,每个字段可以有 1 ..n 个来自 table Contact 的联系人。所以,这样,这意味着我可以有两个作者、3 个分销商和 1 个联系人来处理同一个产品。

我正在考虑将此信息存储在 ProductInfo table 中,每个字段中包含 contact_id 数组,但这似乎不是最佳方法。

你能告诉我我该怎么做吗?

使用数组不是最佳做法,但对于像这样的简单任务,它工作得很好。特别是如果 table productinfo 包含数百万条记录,通过这种方式可以避免繁重的连接、更简单和更快的搜索、一些简单的索引加快查询...

您可以使用第三个 table "link",table 参考生产信息 table 和分配给它的联系人

productInfo_contacts:
ID integer
productinfo_id integer
contacts_id integer
contact_type integer ( 1,2,3 - ... author, distributor, contact ...  )

使用第二种方法更好,因为这样您就有了添加其他联系人类型的方法和空间,例如合著者、贡献者、译者……或者您以后可能需要添加的任何其他联系人。 请记住,连接有时会更复杂,并且在处理大型数据集时会显着影响查询性能

嗯,这是我的拙见:)

一个适当的模型可以像这样:

CREATE TABLE contact (
  contact_id serial PRIMARY KEY
, name text
, phone text
, ...
);

CREATE TABLE product (
  product_id serial PRIMARY KEY
, ...
);

CREATE TABLE product_role (
  role_id int PRIMARY KEY
, role text UNIQUE
);

CREATE TABLE product_contact (
  product_id int REFERENCES product
, contact_id int REFERENCES contact
, role_id    int REFERENCES product_role
, PRIMARY KEY (product_id, contact_id, role_id)
);

如果同一联系人永远不能为同一产品担任多个角色,请不要在 PK 中包含该角色:

, PRIMARY KEY (product_id, contact_id)

这允许简单地向 product_role 添加一行以允许和其他类型的联系人。

如果只有一手充满不同的角色,数据类型"char"可能更适合role_id

  • Any downsides of using data type "text" for storing strings?

基础知识:

  • How to implement a many-to-many relationship in PostgreSQL?