【发布时间】:2021-11-10 14:20:42
【问题描述】:
假设您正在创建一个音乐应用。您有一张播放列表表和一张歌曲表。您将如何在 SQL 环境中为播放列表中的歌曲顺序关系建模?
要求:
- 每个播放列表可以包含多首歌曲
- 播放列表中的歌曲顺序很重要
- 每首歌曲都有自己丰富的信息(艺术家、专辑等)
在客户端,这很简单,只需在播放列表中有一组产品 ID,然后从中获取歌曲信息。如果顺序发生变化,只需更新数组并推送一个新数组。计算密集,但很容易推理,并且没有双倍索引条目的机会。
在关系数据库世界中,通常对于多对多关系,您会使用联结表。其中每个 playlist_id 对应一个 song_id。您可以为索引添加一列,但是当您更新播放列表的顺序时,您必须重写所有索引的顺序。
| id | playlist_id | song_id | index |
|---|---|---|---|
| 1 | 1 | 50 | 1 |
| 2 | 1 | 24 | 2 |
| 3 | 1 | 21 | 3 |
| 4 | 2 | 12 | 1 |
我正在努力寻找这个问题的答案。
对于我的具体情况,我目前正在使用 Supabase 和他们的 Javascript SDK,它引用托管的 PostgreSQL 数据库,一切都通过客户端应用程序完成查询。 我不知道如何编写一个 SQL 函数来处理这个问题。 与每次只推送一个新数组相比,这一切似乎都非常复杂,即使它是“正确的” “ 大大地。貌似PostgreSQL还不支持外键数组,有没有更好的办法?
【问题讨论】:
-
你的 q 很难理解:太多的词,没有图表,没有模式。如果必须保持排序,并且没有告诉排序的“自然”字段(我在你的话中看不到一个),那么你需要引入一个额外的列,纯粹是为了相对排序。它的值无关紧要,只要您可以在序列中插入足够的步骤。请展示您已经完成的设计,然后我们可以讨论。
-
纯用于排序步骤的 BTW 字段在装配线制造的模式设计中非常常见;每个步骤都需要某些组件“固定”到组件上。
-
@AntC 用图表做了一个更清晰的例子,我认为更多的人可以与之相关。我认为我有正确的模型,我不明白的是“我如何编写一个 SQL 函数来更新排序”。
标签: postgresql many-to-many relational-database supabase