【问题标题】:Displaying Multiple Rows of Data from Two Tables with a One to Many Relationship显示具有一对多关系的两个表中的多行数据
【发布时间】:2021-07-12 17:26:02
【问题描述】:

我有两张桌子。曲目和元数据。轨道可以有多个元数据属性,但元数据只能附加到单个轨道。元数据表有一个轨道 ID 的外键,但轨道表没有元数据的外键。我正在尝试找到获得此结果的最佳方法:

[{
   trackID: 6,
   trackName: "test", /* these are the data from the tracks table */
   metadata: [
     {
        bpm: 123 /* This is the data from the metadata table */
     },
     ...
   ]
},
{
   trackID: 7,
   trackName: "test2",
   metadata: [
     {
        bpm: 135
     },
     ...
   ]
}]

本质上,我正在尝试获取多个轨道,每个轨道都有多个元数据属性。我能想到的唯一方法是首先查询曲目

SELECT * FROM tracks;

然后在后端,为每个返回的曲目发送另一个查询

SELECT * FROM metadata WHERE track=?

不向数据库发送大量查询的更好方法是什么?

我也尝试过 JOIN,例如:

SELECT * FROM tracks LEFT JOIN metadata ON metadata.track = track.id WHERE track.id>5 LIMIT 10 ;

但这需要在后端对其进行解析并检查每一行以查看它是否具有相同的轨道 ID,并且总体上看起来也很缓慢且不理想。

有没有更好的方法来做到这一点,这里的最佳做法是什么?提前谢谢你。

PS:如果有帮助,我正在使用 Postgres、NodeJS 和 Prisma。

【问题讨论】:

  • 样本数据——或者至少是表格的布局——真的很有帮助。
  • 我无法满足您的确切要求,需要更多信息,但是在解决“JOIN”选项时,您会说“需要在后端解析它并检查每一行”。这正是 join 所做的,您不必做任何额外的事情,而且它会比您拥有的 2 查询选项快得多。松散地说,RDBMS 的目的是快速进行连接。恕我直言,除了复杂的显示格式之外,请始终在后端做尽可能多的工作。

标签: sql node.js postgresql one-to-many


【解决方案1】:

您应该使用聚合。目前尚不清楚您的数据是什么样的以及您希望结果是什么样的。例如,如果您只想要来自metadatabpm 列(如您的结果所示),那么这会将该值放入名为metadata 的数组列中:

SELECT t.track_id, t.name,
       ARRAY_AGG(m.bpm) as metadata
FROM tracks t LEFT JOIN
     metadata m
     ON m.track = t.id
WHERE t.id > 5
GROUP BY t.track_id, t.name;

如果你想要额外的列,你可以把整条记录放在数组中:

ARRAY_AGG(m) as metadata

Postgres 也通过 JSON 函数支持所有这些。

【讨论】:

  • 正是我想要的,完美无瑕!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2018-09-15
  • 1970-01-01
  • 2016-11-10
  • 2023-01-12
  • 1970-01-01
相关资源
最近更新 更多