【问题标题】:ms-access phone table design for multiple individuals with multiple addressesms-access 电话桌设计,适用于具有多个地址的多人
【发布时间】:2020-07-11 17:43:33
【问题描述】:

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

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

我们的目标是创建一个适用于尽可能多场景的结构。 客户、用户、学生、主管和员工或与标签一起使用的其他类别。

一个人想要或必须在数据库中跟踪公司或组织的联系信息可能会有很大差异,这取决于他们所使用的对象。

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

底部的其他来源。


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

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

tblClients:

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

tbl地址:

  • AddressID (PK)(索引无重复)
  • ClientID (FK)(重复索引)
  • 类别 ID (FK)(ID = 1 或 4)
  • 地址
  • 城市
  • 邮编

tblNumber:

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

tblEmail:

  • EmailID (PK)(索引无重复)
  • ClientID (FK)(重复索引)
  • 类别 ID (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;

vba 用于填充 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?

【问题讨论】:

  • 您提到ClientID -- 在tblAddresstblPhonetblEmail 表中 -- 被索引,没有重复。这似乎是错误的。应该允许相同的ClientID出现多次。
  • 哦,我的错,它被重复索引了,完全错过了我写的“索引没有重复”。谢谢提醒。 :)
  • 请编辑您的问题以更正此问题。你能添加一些你为你的输出做的查询吗?因为您似乎遇到的问题与您的数据模型无关——它设计得很好。
  • 问题已更新,
  • 重复问题很明显,并且是您查询方式(而不是数据模型)的逻辑结果。根据您提供的屏幕截图,您能否在完全相同的数据上提供 desired 输出?这样我们就知道您的实际期望。问题是您的电话号码、电子邮件和地址彼此之间没有直接联系,那么您如何确定哪些应该组合在同一行中,哪些不应该(以避免重复)?

标签: sql vba database ms-access


【解决方案1】:

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

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

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

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

【讨论】:

  • 基本上就是这个。对于表单,附加选项是子表单和列表框。在这两种情况下,相关数据(电子邮件、电话号码)都不包含在主查询中,它们是子表单/列表框的记录/行源。 @托比亚斯奥尔森
  • 听起来你已经准备好了。您的数据模型支持您描述的所有内容。如果子数据不包含在表单的主查询中,则不会重复。您只需在需要时使用它。继续并开始开发表单,如果您遇到任何问题,请告诉我们。
猜你喜欢
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多