当 table_a 的主键可能不存在于 table_b 的一个或多个列中时,如何“链接”两个表?

问题描述 投票:0回答:2

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,但我无法确定如何正确表示这些数据。

有人可以告诉我我做错了吗或次优?有没有更好的方法来用更多结构不同的表来表示这两个表?我很想知道如何将这些数据链接在一起。

任何帮助、指导或意见将不胜感激。提前致谢:)

postgresql email database-design relational-database datamodel
2个回答
0
投票

People 表上的 Email_Address 与 Messages 表上的 From_Address 相同,对吗?如果正确,您可以简单地加入这两个字段。要加入表,您不一定只加入主键。您可以加入任何相关领域。


0
投票

您可以将目标行中的电子邮件与

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类型。

© www.soinside.com 2019 - 2024. All rights reserved.