什么是建模多对多关系的最佳方法?

4
我试图理解以下关系的最佳建模方式:
我有一个名为“联系人”的表,其中包含使用序列字段和其他字段(如“名称”,“电话”,“地址”等)唯一标识的联系人记录。
我还有一个名为“产品信息”的表,其中有多个字段,包括三个名为“作者”,“经销商”和“联系点”的字段,每个字段都可以有1..n来自“联系人”表的联系人。因此,这意味着我可以让两个作者、三个经销商和一个联系点分别与同一个产品相关联。
我考虑将这些信息存储在“产品信息”表中,每个字段中的“contact_id”数组,但这似乎不是最佳方法。
你能告诉我该怎么做吗?

同一个联系人是否可能扮演多个角色(例如作家和分销商)? - Erwin Brandstetter
2个回答

4
一个适当的模型应该允许你使用所需的所有内容,同时强制执行引用完整性,可能看起来像这样:
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)
);

如果同一联系人在同一产品中永远不会扮演多个角色,请不要在主键中包含该角色。
, PRIMARY KEY (product_id, contact_id)

这可以简单地向product_role添加一行,以允许添加其他类型的联系人。
如果只有少量不同的角色,则数据类型"char"对于role_id可能很方便。 基础知识:

1

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

您可以使用第三个表“link”,该表具有对分配给其的productioninfo表和联系人的引用。

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

使用第二种方法更好,因为您可以添加其他联系类型的方式和空间,例如共同作者、贡献者、翻译等等,或者您可能需要稍后添加其他联系人。 请记住,在使用大型数据集时,连接有时会更加复杂,并且会显着影响查询性能。 嗯,这是我个人的看法 :)

感谢您的回答。这正是我要开发的东西 ;) - Falcoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接