【问题标题】:Database design - need guidance数据库设计 - 需要指导
【发布时间】:2015-10-22 20:23:40
【问题描述】:

我可能做错了,但它就是这样。

我正在尝试构建非常基本的 CRM 之类的东西。我知道它们有很多,但实际上我想学习一些东西。我试图为这个特定场景找到现成的例子,但我发现的只是理论和简单化的例子,我无法使用。

我可以让这个图表更简单,但在这种情况下我会有空单元格,所以基本上我在循环这个:)

要求:

  • 以前从未联系过某些公司。这就是为什么我创建了两个额外的表contact_emailscompany_emailscontact_phonescompany_phones

  • 被联系的公司可能已经指定了联系人(人)。

  • 个人可以拥有电话和电子邮件。

  • 一个人可以分配到多个公司

  • 一个公司可以有多个人

图表:

]

问题:

  • 我走对了吗?
  • 可以改进哪些方面以及如何改进?

【问题讨论】:

  • 我不确定您是否需要 company_phones 和 company_emails,没有这些设计应该可以正常工作。任何数据库设计都不应包含表的循环引用——应该始终存在层次结构。
  • 我想我需要它们(可能我错了)。电子邮件可以分配给公司,(稍后联系公司时)电子邮件也可以分配给个人,电子邮件可以分配给公司和个人。
  • 是的,但是您可以通过电子邮件执行此操作-->contact_emails-->联系人-->公司不能吗?
  • 不,我不能,因为联系人不必与公司相关联。例如,在我联系公司本身之前,我不会有联系人。
  • 在这种情况下,company_id 只是空白...

标签: database-design data-modeling database-diagram


【解决方案1】:

你没有做错......很多。 ;)

在设计中没有实现您可以将一个人分配到多个公司的要求。要包含此内容,请从联系人中删除 company_id 并添加:

company_contacts (company_id PK/FK, contact_id PK/FK)

contact_phones 中,我会将company_phones_id 列重命名为phone_id,以与设计其余部分中使用的命名约定保持一致。

公司只能拥有一部电话和电子邮件,除了通过联系人之外,这是否正确?如果不是,请检查companiescompany_emails / company_phones 之间关系的基数指标。如果正确,您可以(我不是说应该)将公司中的company_emailscompany_phones 表替换为email_idphone_id 列。

除了这些问题之外,架构看起来还可以接受。

我可能会考虑进一步调整。为公司和联系人添加超类型(我们可以称它们为派对)将允许您组合 company_phonescontact_phones 表,以及 company_emailscontact_emails 表:

parties (id PK)
contacts (party_id PK/FK, name, surname)
companies (party_id PK/FK, company_name, ...)
party_phones (party_id PK/FK, phone_id PK/FK)
party_emails (party_id PK/FK, email_id PK/FK)

但是,在这种情况下,您无法对数据库中的公司和联系人电话/电子邮件强制执行不同的基数。

【讨论】:

  • 感谢您的回答!公司有多个电话和电子邮件地址,我在数据库设计中犯了错误……你知道替代设计的外观吗?在我的情况下你会怎么做?
  • 只需将company_phones 的主键更改为phone_id(假设每部手机只能属于一家公司)并确保您对company_id 没有唯一约束。 company_emails 类似。
  • 注意,谢谢!你知道整理电话/电子邮件的更好方法吗?
猜你喜欢
  • 2020-09-16
  • 2016-12-14
  • 2011-01-14
  • 2020-10-03
  • 2010-11-09
  • 2014-10-22
  • 1970-01-01
相关资源
最近更新 更多