gpt4 book ai didi

php - 在规范化数据库模式中访问数据的最佳方式是什么?

转载 作者:行者123 更新时间:2023-11-29 14:08:02 25 4
gpt4 key购买 nike

我一直遇到规范化数据库的问题,我一直在寻找最佳解决方案。

假设我有一个专辑信息数据库。我想以规范化的方式设置架构,所以我设置了两个表 - 专辑,其中每个专辑都有一个列表,以及歌曲,其中列出了专辑中包含的所有歌曲。

albums
------
aid
name

songs
-----
aid
sid
length

此设置有利于以规范化方式存储数据,因为一张专辑可以包含任意数量的歌曲。然而,以直观的方式访问数据现在变得更加困难。只抓取单个专辑信息的查询很简单,但是如何在一个查询中一次抓取多个专辑?

到目前为止,我想出的最佳答案是通过辅助分组并将歌曲信息转换为数组。例如,结果看起来像这样:

aid, sids,      lengths
1, [1, 2], [1:04, 5:45]
2, [3, 4, 5], [3:30, 4:30, 5:30]

当我想处理数据时,我必须解析 sids 和长度,这似乎是一个毫无意义的练习:我让数据库连接一堆值只是为了稍后将它们分开。

我的问题:使用这种模式访问数据库的最佳方式是什么?我是否坚持使用多个阵列?我应该将歌曲的全部信息存储在一个对象中,然后将这些歌曲存储到一个数组中,而不是拥有多个数组吗?或者有没有办法向结果集添加任意数量的列(某种无限连接)以容纳 N 首歌曲?我乐于接受有关如何以最佳方式访问数据的任何想法。

我也很关心效率,因为这些查询会经常运行。

如果有任何不同,我使用的是 PostgreSQL 数据库和 PHP 前端。

最佳答案

我很难理解你的意思。 “如何在一次查询中一次获取多个专辑”到底是什么意思?你到底有什么困难?

直觉上我会说:

SELECT
a.aid album_id,
a.name album_name,
s.sid song_id,
s.name song_name,
s.length song_length
FROM
albums a
INNER JOIN songs s ON a.aid = s.aid
WHERE
a.aid IN (1, 2, 3)

SELECT
a.aid album_id,
a.name album_name,
COUNT(s.sid) count_songs,
SUM(s.length) sum_length /* assuming you store an integer seconds value */
FROM /* here, not a string containing '3:18' or such */
albums a
INNER JOIN songs s ON a.aid = s.aid
WHERE
a.aid IN (1, 2, 3)
GROUP BY
a.aid

取决于您想了解/展示的内容。您可以查询数据库以获取汇总信息,也可以根据应用程序中的查询结果 #1 自行计算。

取决于您的应用中缓存了多少数据,以及查询需要多长时间,一种策略可能比另一种更快。不过,我建议查询数据库。数据库就是为这类东西而生的。

关于php - 在规范化数据库模式中访问数据的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/526118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com