【问题标题】:SQL - Designing a Phone book database with Hierarchical model (master-client)SQL - 使用分层模型(主客户端)设计电话簿数据库
【发布时间】:2012-12-20 10:10:38
【问题描述】:

我刚加入这个网站,这是我的第一个问题,我希望我的问题符合 StackOverflow 问题政策。

我正在设计一个具有以下功能的电话簿数据库

  • 联系人有 2 种类型(公司或个人)->ContactType
  • 而且我希望每个联系人拥有尽可能多的电子邮件、电话号码和地址。
  • 我想指定哪个 Person 在哪个 Company 工作,这样我不仅可以显示 Company 的详细联系信息,还可以显示该公司的员工及其在该公司的工作及其联系人列表(CoEmpJob 表)

我已经设计了一个 db 图,如下面的链接所示,它的结构是否合理,或者我能以更好的方式实现我想要的吗?

提前致谢。

My Phone Book Design

【问题讨论】:

  • 获取一份“数据模型资源手册”。它有针对此类情况的解决方案,并有完整的文档记录。电话簿我想有 50 页左右,有地址等。

标签: sql-server database-design


【解决方案1】:

就设计而言,您缺少一些东西,例如 Companies 表和 ContactTypes 表。 CoEmpJob 表中似乎没有链接到 Contacts 表的外键。

在电话表中,我个人不会使用前缀字段(除非您希望按电话前缀显示联系人),在这种情况下,每个电话号码都保证是唯一的,在这种情况下,PhoneNum 字段将成为主要字段key 和 PhoneID 字段是不必要的 - 但您可能会遇到丈夫和妻子在同一个数据库中的情况;虽然他们几乎可以肯定有不同的手机号码,但他们几乎可以肯定共享同一个家庭电话号码!在这种情况下,您的设计是正确的。

我不知道有多少人拥有多个地址(我认为很少,如果有的话),这意味着地址表的字段可以移动到联系人表中。

(添加) 至于公司,如果您想指定哪个人在哪个公司工作,那么您将需要一个公司表(缺失)和一个连接表(CoEmpJob)。在现实世界中,这种设计还需要更多的表——连接表可以显示哪些联系人与哪些公司相关联以及他们当前的工作是什么,但人们会更换工作(和公司),因此这样的设计不会存储任何历史记录.此外,习惯上将人员(员工)链接到一个部门 - 一个人可能一次连接到多个部门,这意味着您将需要另一个连接表。这可能会变得非常复杂 - 这取决于您想要什么。

您的评论表明您希望将公司数据存储在联系人表中 - 这是一个非常糟糕的主意;它们应该分开存放。

【讨论】:

  • 感谢您的回答,也许我将 IsPerson 作为 Boolean 而不是 ContactType 字段更好,关于 CoEmpJob 表是的,它有 2 个外键链接到联系人表(CompanyID-> ContactID 其中 IsPerson=False , CompanyEmployeeID-> ContactID 其中 IsPerson=True)。我的主要问题是关于 CoEmpJob 表,我可以实现我想要的还是有更好的方法?
猜你喜欢
  • 2011-11-05
  • 2017-10-06
  • 2012-10-29
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多