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

时间:2015-11-16 13:59:22

标签: postgresql database-design many-to-many

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

我有一个名为Contact的表,其中包含使用serial字段和namephoneaddress等其他字段唯一标识的联系人记录等等。

我还有一个名为ProductInfo的表格,其中包含多个字段,其中包括名为AuthorDistributorPointOfContact的三个字段,每个字段可以有来自表的1..n个联系人Contact。所以,通过这种方式,这意味着我可以拥有两位作者,3位经销商和1位同一产品的联系人。

我在考虑将这些信息存储在ProductInfo表中,每个字段中包含contact_id数组,但这似乎不是最好的方法。

你能告诉我该怎么办吗?

2 个答案:

答案 0 :(得分:2)

在执行参照完整性时允许您需要的所有内容的正确模型可能如下所示:

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

基础:

答案 1 :(得分:1)

使用数组不是最佳实践,但对于像这样的简单任务,它可以正常工作。特别是如果表productinfo包含数百万条记录,这样就可以避免繁重的连接,更简单快速的搜索,一些简单的索引加速查询...

您可以使用第三个表“link”,表格包含对productioninfo表的引用和分配给它的联系人

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

使用第二种方法更好,因为那时您有方法和空间来添加其他联系人类型,例如共同作者,贡献者,翻译者......或者您稍后可能需要添加的任何其他联系人。 请记住,加入有时会更复杂,并且在处理大型数据集时会显着影响查询性能

嗯,这是我的不好意见:)。