sql - 在数据库中存储一对多关系 - 数组或一对多关系?

标签 sql arrays postgresql graph

当我们将一对多关联存储在数据库中时,这是一种更好的方法。一 - 表中的多个映射或将多个部分存储为数组。我特定于postgres数据库(约束)

例如:如果我们定义关系如下

a   b
1 - 2
1 - 3
1 - 6
2 - 3 
2 - 4
3 - 5
3 - 6

这里,一个部分是a,许多部分是b(主键是a,b)

同样的东西可以存储为数组as(类似于邻接表)。

1 - {2,3,6}
2 - {3,4}
3 - {5,6}

哪个更有效率。我可能必须对此进行一些操作,例如传递闭包等,而且该图可能非常庞大。

上述的实际示例可能是特定个人资料的连接(LinkedIn 连接)或任何社交图场景

最佳答案

在您的示例中,关系是多对多,而不是一对多。多个 a记录可以与一个 b 相关联和多个 b记录可以与一个 a 相关联.因此,正确的规范化形式是 join table .

假设地,假设这种数据库关系代表一个个人资料在社交媒体环境中“喜欢”另一个个人资料。在这种情况下,您可能想要存储额外的信息;启动“喜欢”的时间戳,配置文件耸耸肩/喜欢/喜欢其他配置文件的程度等。然后很明显,在数组实现中没有地方可以存储这些额外数据。您需要一个连接表,以便每个“喜欢”都可以有自己的元数据。

这是我推荐的结构:

PK   A   B
100  1 - 2
200  1 - 3
300  1 - 6
400  2 - 3 
500  2 - 4
600  3 - 5
700  3 - 6

其中 PK 是自动生成的 PK,希望来自序列,并且 A, B受唯一索引约束。这种结构是最终在 A, B 上删除唯一索引的 future 证明。 ,我偶尔不得不处理的头痛问题。

关于sql - 在数据库中存储一对多关系 - 数组或一对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451406/

相关文章:

php - 更改 gmdate PHP 函数的时区

java - 如何从常量 java 为注解提供值

javascript - 如何将 angularjs attrs 转换为数组

ruby - 使用 PG gem 在参数化语句中进行多次插入

sql - Julia:如何将数据框值放入单个变量中

sql - 如何在 SQLite 中连接具有相同行数的两个表?

java - 如何在Java持久性查询语言中使用正则表达式?

arrays - 确定是否存在长度 > 1 且均值为整数的连续子数组

postgresql - 如何将 REAL 类型舍入为 NUMERIC?

ruby-on-rails - 如何使用大写列名的 Rails?