具有多个地址的多个人的ms访问电话表设计

时间:2016-06-24 20:49:10

标签: sql database access-vba ms-access-2013 ms-access-2016

如何为多个人设计多个联系信息的表和关系?

联系信息彼此相关,尤其是地址和电话号码。

目标是建立一个尽可能多的场景。 客户,用户,学生,主管和员工或与标签一起使用的其他类别。

人们希望或必须在公司或组织的数据库中跟踪的联系信息可能会有很大差异,具体取决于他们的工作方式。

这是我很难解决的问题,解决这个问题的方法在网上很分散。

底部的其他来源。

  • 每个客户/员工/学生都可以拥有一个或多个地址,如女贞和工作地址。
  • 每位客户/员工/学生都可以拥有一个或多个电话号码,如手机,工作,私人(和传真)
    1. 一名员工,也有一页或多页。
  • 每个客户/员工/学生可以拥有多个电子邮件地址,例如私人和工作。

我目前的桌面设计。 (相关表格)

tblClients:

  • ClientID(PK)(索引无重复)
  • KlientKey(安全号码或个人ID)(索引无重复)
  • 名字

tblAddress:

  • 地址ID(PK)(索引无重复)
  • ClientID(FK)(使用重复索引)
  • CategoryID(FK)(ID = 1或4)
  • 地址
  • ZIP

tblNumber:

  • NumberID(PK)(索引无重复)
  • ClientID(FK)(使用重复索引)
  • AddressID(FK)(用重复索引)(无表关系,实验。)
  • 类别(FK)(ID = 2或3或5)

tblEmail:

  • EmailID(PK)(索引无重复)
  • ClientID(FK)(重复索引)
  • CategoryID(FK)(ID = 1或4)
  • 电子邮件

tblCategorys:

  • CategoryID(PK)(索引无重复)
  • 类别(1;私人,2;电话,3;移动,4;工作,5;传真)

只要数据在表单,查询或报表中列出,此结构就会生成重复项。问题与电话号码和地址有关。 只要两个地址或具有相同类别的电话号码必须显示在列表中,就会发生冲突。嗯,这就是相信的。

如下所示,联系信息是重复的。我想防止这种情况发生。另外,我想防止电话号码显示在没有显示电话号码的记录上。 如果我在这里有任何意义,这些报告只显示家庭的私人地址和其他词语。 (Img被删除了两个声誉限制。)

如图所示,我希望报告看起来像。 我用新的tbl设计,新的查询和一点点vba实现了这个结果。这只是实验而已。 Img 2 - experimental

客户&电子邮件

SELECT tblClients.ClientID, 
       tblClients.ClientKey, 
       [tblClients].[LastName] & ",  " & [tblClients].[Firstname] AS Klient,            
       tblClients.Startdate, 
       tblClients.EndDate, 
       [qryList(PrivateEmails)].Email, 
       tblClients.LastName
FROM tblClients 
LEFT JOIN [qryList(PrivateEmails)] 
     ON tblClients.ClientID = [qryList(PrivateEmails)].ClientID;

地址&电话号码

SELECT tblAddress.ClientID,
       tblAddress.Address, 
       tblAddress.ZIP, 
       tblAddress.City, 
       tblNumber.Number, 
       tblAddress.CategoryID, 
       tblNumber.AddressID, 
       tblNumber.CategoryID

FROM tblAddress 
LEFT JOIN tblNumber 
     ON tblAddress.AddressID = tblNumber.AddressID
WHERE (((tblAddress.CategoryID) 
      Is Null Or (tblAddress.CategoryID)=1) 
         AND ((tblNumber.AddressID) 
      Is Null Or (tblNumber.AddressID)>=1) 
         AND ((tblNumber.CategoryID) 
      Is Null Or (tblNumber.CategoryID)=2));

最终查询

SELECT Clients.*, [qryAddress&PhoneNuber(Private)].*
FROM Clients 
LEFT JOIN [qryAddress&PhoneNuber(Private)] 
     ON Clients.ClientID = [qryAddress&PhoneNuber(Private)].ClientID;

用于填充tblnumbers中的addressID,当用户在添加或编辑新记录时保存表单中的更改时触发。

' A Dynamic array would be usful whenever multiple addresses and phone numbers is added as private.
   If IsNull(varAddressID) = 0 Then
        If Me.frmAddress.Form.txtCategoryID = 1 Then
            If Me.frmNumber.Form.txtCategoryID = 2 Then
                Me.frmNumber.Form.txtAddressID = Me.frmAddress.Form.txtAddressID
            End If
        End If
    End If

这是我只在想查看私人联系信息时使用的sql qry。

SELECT    tblClients.ClientKey,
          [tblClients].[LastName] & ".  " & [tblClients].[FirstName] AS Klient,
          tblClients.Startdate,
          tblClients.EndDate,
          [qryList(NumberPrivate)].Number,
          [qryList(PrivateAddresses)].Address,
          [qryList(PrivateAddresses)].ZIP,
          [qryList(PrivateAddresses)].City, 
          [qryList(PrivateEmails)].Email 
FROM ((
LEFT JOIN [qryList(PrivateEmails)] 
       ON tblClients.ClientID = [qryList(PrivateEmails)].
LEFT JOIN [qryList(PrivateAddresses)] 
       ON tblClients.ClientID = [qryList(PrivateAddresses)].
LEFT JOIN [qryList(NumberPrivate)] 
       ON tblClients.ClientID = [qryList(NumberPrivate)].ClientID 
WHERE  ((([qryList(NumberPrivate)].CategoryID) Is Null 
                 Or ([qryList(NumberPrivate)].CategoryID)=2) 
    AND (([qryList(PrivateAddresses)].CategoryID) Is Null 
                 Or ([qryList(PrivateAddresses)].CategoryID)=1) 
    AND (([qryList(PrivateEmails)].CategoryID) Is Null
                 Or ([qryList(PrivateEmails)].CategoryID)=1))
ORDER BY  tblClients.ClientKey DESC, 
          [tblClients].[LastName] & ".  " & [tblClients].[FirstName] DESC,
          tblClients.Startdate,
          tblClients.EndDate DESC; 

具有相同或相似主题的其他来源:

http://www.sqlservercentral.com/Forums/Topic637723-361-1.aspx

Normalize or Denormalize: Store Contact Details (Phone Numbers) in separate Table? Search Performance?

1 个答案:

答案 0 :(得分:1)

根据您要存储的数据,您的数据模型很好。

问题更多的是关于输出 - 如何查询数据,以便在我不想要的时候不会显示重复的行。

对于这个问题,有很多答案取决于你想要做什么。 (即报表上的组值(通常的解决方案),将电子邮件连接成一行,获取子对象的最大值或最小值等)。

我建议您在查询中发布另一个问题,以及您遇到的任何问题。