【问题标题】:Database design grouping contacts by lists and companies数据库设计按列表和公司对联系人进行分组
【发布时间】:2011-03-01 07:20:56
【问题描述】:

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

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

联系
[id_contact] [int] PK NOT NULL,
[姓氏] [varchar] (128) NULL,
[firstName] [varchar] (128) NULL,
……

联系人列表
[id_contact] [int] FK,
[id_list] [int] FK,

列表
[id_list] [int] PK
[id_user] [int] FK
[list_name] [varchar] (128) 非空,
[描述] [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,
[公司名称] [varchar] (128) NULL,
[company_description] [varchar] (300) NULL,
[created_date] [datetime] NOT NULL

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

【问题讨论】:

    标签: mysql database database-design relational-database


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

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

    【讨论】:

    • +1 因为您与我实施的非常接近,除非我认为您可能误解了一个细节(或者我可能误解了您的答案)您正在将用户链接到一家公司(或几家公司) ) 实际上,一个联系人需要与一个或多个公司相关联。有一个联系人的主列表,用户可以创建他们自己的分组。我发布的更新显示默认情况下联系人是如何按公司分组的,我基本上使用了相同的表格布局,但用于创建列表。
    • 对于公司职位,当您说另一个表时,您是指创建一个表并插入默认值,例如Project Manager等,还是让用户在该表中插入值并将其链接到联系人?
    • 我已经有一段时间没有回答了,但我想我记得发生了什么。这个设置我有链接到公司的联系人,它被称为user_contact_company 的唯一原因是因为联系人与用户相关,而联系人与公司相关。所以用户没有直接链接,联系人是。不过,我可能误解了你在说什么,如果我说得不对,请纠正我。
    • 通过另一个表,我的意思是您将有另一个表,其中包含 id 字段和 position 字段或其他任何内容。另一个表中的position 字段将引用此position 表。这只是为了确保如果用户变得懒惰或健忘,他们不会有“项目经理”或“PM”与“项目经理”之类的条目,这些条目可能会以不同的方式排序,或者如果他们忘记了他们使用的术语并发明一个新的,比如 CEO 而不是 CEO,这意味着相同但排序不同。
    • 所以基本上有一个自动建议框可以获取数据库中已有的职位,如果该职位尚不存在,请将其添加到数据库中。
    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2023-02-04
    相关资源
    最近更新 更多