当
People
表中没有与Messages
表的主键对应的列时,如何链接Messages
和People
两个表?
我有两张桌子。一个包含名为
Messages
的电子邮件和一个名为 People
的人。他们看起来像这样:
人
| person_id | email_address |
| -------- | -------------- |
| 001 | `[email protected]` |
| 002 | `[email protected]` |
| 003 | `[email protected]` |
| 004 | `[email protected]` |
| 005 | `[email protected]` |
消息
| msg_id | from_addr | to_addr | cc_addr | bcc_addr |
| ------ | ----------------- | ----------------------------------- | ----------------- | ----------- |
| 001 | `[email protected]` | `[email protected]`, `[email protected]` | `[email protected]` | NULL |
| 002 | `[email protected]` | `[email protected]` | NULL | NULL |
| 003 | `[email protected]` | `[email protected]` | `[email protected]` | `[email protected]` |
我将以编程方式传递一个
person_id
(例如005
代表[email protected]
),并希望能够查询Messages
数据集以获取[email protected]
“参与”的所有电子邮件。通过“参与” ",我的意思是 [email protected]
在电子邮件中是发送、接收、抄送还是密件抄送。因此,对于上面的数据集,查询应该返回带有 msg_id
001
和 003
. 的行
People
和Messages
表之间的关系。假设
People
表的主键是person_id
。在 Messages
表中没有 single列可以链接到它作为外键。
我是关系数据库设计的新手,一直在尝试构建将这两个实体放在一起的 ERD,但我无法确定如何正确表示这些数据。
有人可以告诉我我做错了吗或次优?有没有更好的方法来用更多结构不同的表来表示这两个表?我很想知道如何将这些数据链接在一起。
任何帮助、指导或意见将不胜感激。提前致谢:)
People 表上的 Email_Address 与 Messages 表上的 From_Address 相同,对吗?如果正确,您可以简单地加入这两个字段。要加入表,您不一定只加入主键。您可以加入任何相关领域。
ANY
电子邮件进行比较 array 结合messages
表中的电子邮件地址:
select m.*
from messages as m
join people as p
on p.email_address = any(m.from_addr||
m.to_addr ||
m.cc_addr ||
m.bcc_addr )
where p.person_id='005';
messages
和 people
之间的中间表可以包含一个属性,说明它们是如何相关的(from/to/cc/bcc),加上一个地址。这将更容易使用和索引:demo 可能值得研究其他方式来存储电子邮件地址而不是普通的
text
类型。