问题描述
有许多与父/子和多对多关系相关的问题,但我找不到一个似乎对我的需求有意义的问题。
我有一个“样本”数据库,让我们将其视为桶中的某种东西。每个样本都有一个关联的 ID。我想捕捉的是任何给定的样本都可以有一个父样本(即,通过将桶倒入一堆较小的罐子中,可以将一个样本分成多个新样本)。此外,一个样本可以有多个父样本;通过组合多个父样本创建一个新 jar。这里的关键是子样本和父样本代表相同的事物(样本),因此应该是同一个表的成员。
我从一个 samples
表开始,其中的列是 id
、date
、project
和 parent
。 id
是一个字母数字 ID(即 A0001
、A0002
),而 parent
是一个 ID 数组,应该返回到样本列表。换句话说,父必须是samples
的成员。
我无法在 id
和 id
中的 parent
列表之间设置外键关系。
有没有办法做到这一点?
我想过创建一个 parents
表,但后来我可能有以下内容:
samples
-------
id date project parent
A0001 2020/11/01 alpha []
A0002 2020/11/01 beta []
A0003 2020/11/05 gamma [A0001,A0002]
A0004 2020/11/05 gamma [A0002]
parents
-------
id children
A0001 [A0003]
A0002 [A0003,A0004]
我仍然遇到需要在 CHAR
和 CHAR[]
之间使用外键关系的情况。
我希望能够通过父数组中可用的 date
查询信息(例如 project
和 id
)。我想我可以在数据库之外处理这个问题,但这似乎是一种黑客行为,而不是正确的方法。
对于上下文,我使用的是 Postgresql v13.0 和 Hasura GraphQL v1.3.3。
感谢任何帮助或建议。
解决方法
通常在谈论人际关系时,一个孩子只有一个父母——尽管这并不是人际关系的运作方式。典型的例子是树结构。
您似乎只想要一个有向图。这表明有两个表:
样品
sample_id | 日期 | 项目 |
---|---|---|
A0001 | 2020/11/01 | alpha |
A0002 | 2020/11/01 | 测试版 |
A0003 | 2020/11/05 | 伽玛 |
A0004 | 2020/11/05 | 伽玛 |
和
关系:
parent_sample_id | child_sample_id |
---|---|
A0001 | A0003 |
A0002 | A0003 |
A0002 | A0004 |
- 编辑 * 我已经修正了上面
0
表中缺失的child_sample_id
。