一到三个其他表之间的最佳关系

时间:2014-11-18 10:20:07

标签: sql database data-modeling

我正在扩展CRM应用程序的模型。

在现有模型中,我们有这些表:

  • 人p
  • 公司c
  • CompanyPerson cp(n:m)

我们想要创建一个名为:

的新表
  • 关系

那可以是:

  • 公司
  • 在公司工作的人员

定义此表的最佳方法是什么?

  1. Relation中创建3个可空的FK,其中一个不需要为空(在代码中)
  2. Relation中将2个可空的FK设为p和c,其中一个或两个必须不为空(在代码中)
  3. Relation和这些表格(p,c,cp)之间制作3个新的n:m表格
  4. 谢谢, 埃弗特-扬

2 个答案:

答案 0 :(得分:1)

因此,关系或多或少是一种联系,可以是私人关系(与人的联系),也可以是公司或公司中的特定人。

因此,关系应该有两个可选(即可为空)字段:对于一个人和一个公司。

  • 人( id_person ,名字,姓氏,......)
  • 公司( id_company ,名称,......)
  • CompanyPerson( id_person id_company ,工作,工资......)
  • 关系( id_relation ,id_person,id_company,letter,...)

您对Person,Company和CompanyPerson有外键约束,因此每当填充id_person时,它必须在表Person中;每当id_company被填满时,它必须在表公司;每当两者都填满时,他们必须在表CompanyPerson中。

此外,您还要添加一个检查约束,以确保为每个Relation记录填充两个字段中的至少一个。

答案 1 :(得分:0)

实现的另一个想法可以是人们称之为polymorphic association的内容。您的Relation表应包含2个字段,NOT NULL如下:

Relation
  - entity varchar(10) NOT NULL
  - entity_id integer NOT NULL

当它是某人时,entity字段应包含字符串Person,而entity_id应包含Person表的外键。
当它是公司时,entity字段应包含字符串Companyentity_id应包含Company表的外键。

然后,您可以在应用程序代码上对其进行抽象。