mysql - 数据库设计按列表和公司对联系人进行分组

标签 mysql database database-design relational-database

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

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

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

contact_list
[id_contact] [int] FK,
[id_list] [int] FK,

list
[id_list] [int] PK
[id_user] [int] FK
[list_name] [varchar] (128) NOT NULL,
[description] [TEXT] NULL

我应该实现类似的方法来按公司对联系人进行分组吗?如果是这样,我将如何存储联系人在该公司的职位,以及如果用户修改联系人的公司名称,我如何防止数据损坏。例如,John Doe 换了公司,但其他同事仍然在老公司。

我怀疑这种情况会经常发生(甚至可能根本不会发生),但安全总比后悔好。我还在保留审计跟踪,因此在某种程度上,联系人仍然需要与旧公司和新公司相关联,但又不会混淆他目前实际工作的公司。

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

<小时/>

更新

这样的事情有意义

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

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

这样,一个联系人就可以为多个公司工作,并且可以按公司对联系人进行分组

最佳答案

您所拥有的更新内容看起来不错。

因此,在我看来,您有用户,每个用户都有一个联系人主列表。用户还具有用于组织主列表内的联系人的进一步列表。每个联系人都有他们的姓名和联系信息以及他们曾工作过的几家公司,此外他们还必须跟踪他们当前的公司。

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

我觉得我在重复你所拥有的,但我会提出看起来最好的设置。我只是按照我的约定编写以下内容(下划线表示一对多):

*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,以便将所有公司分组在一起,然后显示公司的代码可以查看当前公司是否与以前的公司不同,并做出正确的区分。

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

关于mysql - 数据库设计按列表和公司对联系人进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999931/

相关文章:

php - 选择查询检查表单数据是否已存在于数据库 MySQL/PHP 中的小问题

sql - 草稿/直播内容系统数据库设计

database-design - 多个外键

php - $_POST 在 AJAX 调用的页面中不起作用

mysql - 排序非常大的mysql表并写入文件

android - 如何将数据库插入到 Android 应用程序中

mysql - 我怎样才能安全地备份一个巨大的数据库?

mysql - 如果我的复合索引是唯一的,我还需要主键吗?

mysql - 将歌词存储在 MySQL 数据库中

php - MySQL 的输出