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

标签 php sql database postgresql

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

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

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/

相关文章:

mysql - SELECT 一个表的一行,以及另一个表中的所有行

mysql - 如何创建此权利加入

java - 在 Oracle 和 Vertica 之间移动数据的有效方法

MySQL 与 Microsoft SQL

php - 如何构建一个函数并在 cakephp 中随处调用它

php - 为初学者优化 MySQL 查询(添加索引、重写查询、使用解释等)?

SQL来自一个分组的两个条件

Linux:比较大文件

php - 更新 Ajax 和 PHP 中的 SQL 值

php - 我可以在 PHP EOD 中使用条件逻辑吗?