【发布时间】:2021-04-21 13:56:43
【问题描述】:
有许多与父母/孩子和多对多关系相关的问题,但我找不到一个似乎对我的需求有意义的问题。
我有一个“样本”数据库,让我们将其视为桶中的某种粘液。每个样本都有一个关联的 ID。我想捕捉的是任何给定的样本都可以有一个父样本(即,可以通过将桶倒入一堆较小的罐子中,将一个样本分成多个新样本)。此外,一个样本可能有多个父样本;通过组合多个父样本创建一个新 jar。这里的关键是子样本和父样本代表相同的事物(样本),因此应该是同一个表的成员。
我从samples 表开始,其中的列是id、date、project 和parent。 id 是一个字母数字 ID(即A0001、A0002),parent 是一个 ID 数组,应该参考样本列表。换句话说,父级必须是samples的成员。
我无法在id 和parent 中的ids 列表之间设置外键关系。
有没有办法做到这一点?
我考虑过创建一个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[] 之间使用外键关系的情况。
我希望能够通过父母数组中的ids 查询信息(例如date 和project)。我想我可以在数据库之外处理这个问题,但这似乎是一种 hack,而不是正确的方法。
对于上下文,我使用的是 Postgresql v13.0 和 Hasura GraphQL v1.3.3。
感谢任何帮助或建议。
【问题讨论】:
-
"我需要在 CHAR 和 CHAR[] 之间使用外键关系" - 不,你不需要。摆脱非规范化数组并创建适当的多对多关系。那么定义外键就完全没有问题了。另外:don't use char
-
另外请注意,我对数据库结构/SQL/等还是很陌生,所以请原谅我的肉食。我想我明白了......我最初认为父母表不应该有同一个父母的多个实例,但在阅读更多之后,这似乎仍然是符合规范化规则的犹太教。所以
parents表中这样的内容是可以的:(id: A0001, child: A0003), (id: A0002, child: A0003), (id: A0002, child: A0004) -
PS 感谢您对
char用法的提示...这里的所有text! -
是的,这也是订单和产品之间的类似关系:一个 orderID 可以有多个 productID 以了解订单包含的内容。
-
@PaulT。主要区别在于父级也是一个样本,创建了这个递归,我遇到了问题。为了启用此解决方案,我现在有一个
parent-childID 表,但我无法拥有主键,因为父项和子项都会重复。
标签: sql postgresql foreign-keys hasura