【发布时间】:2020-07-11 17:43:33
【问题描述】:
如何为多个人设计多个联系信息的表格和关系?
联系信息是相互关联的,尤其是地址和电话号码。
我们的目标是创建一个适用于尽可能多场景的结构。 客户、用户、学生、主管和员工或与标签一起使用的其他类别。
一个人想要或必须在数据库中跟踪公司或组织的联系信息可能会有很大差异,这取决于他们所使用的对象。
这是我很难解决的问题,解决这个问题的方法在网上存在很大分歧。
底部的其他来源。
- 每个客户 /employee /student 可以有一个或多个地址,例如女贞地址和工作地址。
- 每个客户/员工/学生可以有一个或多个电话号码,例如手机号码、工作号码、私人号码(和传真)
- 一名员工,也有一个或多个页面。
- 每个客户/员工/学生可以有多个电子邮件地址,例如私人和工作。
我目前的桌子设计。 (相关表格)
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
【问题讨论】:
-
您提到
ClientID-- 在tblAddress、tblPhone和tblEmail表中 -- 被索引,没有重复。这似乎是错误的。应该允许相同的ClientID出现多次。 -
哦,我的错,它被重复索引了,完全错过了我写的“索引没有重复”。谢谢提醒。 :)
-
请编辑您的问题以更正此问题。你能添加一些你为你的输出做的查询吗?因为您似乎遇到的问题与您的数据模型无关——它设计得很好。
-
问题已更新,
-
重复问题很明显,并且是您查询方式(而不是数据模型)的逻辑结果。根据您提供的屏幕截图,您能否在完全相同的数据上提供 desired 输出?这样我们就知道您的实际期望。问题是您的电话号码、电子邮件和地址彼此之间没有直接联系,那么您如何确定哪些应该组合在同一行中,哪些不应该(以避免重复)?
标签: sql vba database ms-access