数据库设计按列表和公司分组联系人

时间:2010-06-08 17:59:41

标签: mysql database database-design relational-database

我想知道他们公司将联系人分组的最佳方式是什么。目前,用户可以通过自定义创建的列表对其联系人进行分组,但我希望能够通过公司对联系人进行分组,并存储联系人的位置(即< em> XYZ公司的项目经理)。

数据库方面,这就是我将联系人分组到列表中的原因

  


  [id_contact] [int] PK NOT NULL,
  [lastName] [varchar](128)NULL,
  [firstName] [varchar](128)NULL,
  ......

     

CONTACT_LIST
  [id_contact] [int] FK,
  [id_list] [int] FK,

     

列表
  [id_list] [int] PK
  [id_user] [int] FK
  [list_name] [varchar](128)NOT NULL,
  [描述] [TEXT] NULL

我应该为公司分组联系人实施类似的东西吗?如果是这样,我将如何存储联系人在该公司中的位置,如果用户修改联系人的公司名称,如何防止数据损坏。例如John Doe改变了公司,但其他同事仍在旧公司。

我怀疑这种情况会经常发生(甚至根本不会发生),但最好是安全而不是抱歉。我还要保留审计线索,这样联系人仍然需要与旧公司和新公司联系,但不要混淆他现在正在工作的公司。

我希望有道理......有没有人遇到过这样的问题?


更新

这样的事情是否有意义

  

contact_company
  [id_contact_company] [int] PK
  [id_contact] [int] FK
  [id_company] [int] FK
  [contact_title] [varchar](128)

     

公司
  [id_company] [int] PK NOT NULL,
  [company_name] [varchar](128)NULL,
  [company_description] [varchar](300)NULL,
  [created_date] [datetime] NOT NULL

通过这种方式,联系人可以为多家公司工作,联系人可以按公司分组

1 个答案:

答案 0 :(得分:1)

您对更新的看法是正确的。

因此,正如我所看到的,您拥有用户,每个用户都有一个主联系人列表。用户还具有用于在主列表内组织联系人的进一步列表。每个联系人都有他们的姓名和联系信息以及他们为之工作的几家公司,而且他们必须跟踪他们当前的公司。

将公司放在一张单独的桌子上是一个好主意。通常情况下,文本字段可以使用,但由于您计划将公司更多地用作单独的实体,因此单独的表格效果最佳。

我觉得我在重复你所拥有的东西,但我会把看似最好的设置。我只是用我的约定写下面的内容(下划线表示一对多):

*user*
id [int PK], 
... 

*user_contact*
id [int PK], 
user [int FK (user)], 
currentCompany [int FK (company)] 
... 

*user_contact_company*
id [int PK], 
contact [int FK (user_contact)], 
company [int FK (company)], 
startDate [date],
endDate [date]
...

*user_contactList*
id [int PK],
user [int FK (user)]
... 

*user_contactList_contact*
id [int PK], 
contactList [int FK (user_contactList)], 
contact [int FK (contact)] 
...

*company*
id [int PK] 
... 

然后,对于基本分组:

SELECT * FROM `user_contact` WHERE `user` = <USER_ID> GROUP BY `currentCompany`

但我认为这不会按你喜欢的方式运作,所以你可以有两个问题:

SELECT DISTINCT `currentCompany` FROM `user_contact` WHERE `user` = <USER_ID>

然后对每家公司:

SELECT * FROM `user_contact` WHERE `company` = <COMPANY>

还有很多其他方法可以执行此操作,具体取决于您计划如何实施它。例如,您可以执行ORDER BY,因此所有公司都组合在一起,然后显示公司的代码可以查看当前公司是否与以前的公司不同,并做出正确的区分。

至于公司职位,你可以考虑做文本或引用另一个表,具体取决于你如何使用它。如果您要进行排序,以便“项目经理”将与其他“项目经理”分组,那么它应该在另一个表中,否则有人可能会选择与项目管理器不同的名称,或者将名称命名为小写,即使它们在语义上是一样的。