2

我正在用 OOP(仍在学习)PHP 中编写自己的简单画廊脚本。

我正在尝试以最有效的方式从数据库中提取相册,因为当前的图库脚本 (Gallery2) 资源非常繁重,这将取代它。目前的画廊有大约 35,000 件物品和大约 100 张专辑。

专辑布局
(来源:iforce.co.nz

如上图所示,我需要无限的子专辑(实际上最多可能只有 5-6 个)。

数据库布局非常简单,因为它需要做的就是显示图像。

专辑表album_id(int/auto_increment)album_parent(int)album_name(tingtext)

项目表 item_id (int/auto_increment) item_album (int) item_name (int)

我提出的几个查询都是基于使用 WHERE 语句并脱离父专辑 ID 例如..

父 ID 0 = 顶级父 ID 3 将抓取所有以该 ID 为父的专辑。

我遇到的问题是我想使用专辑(album_1/subalbum_1/etc)名称和子专辑来构建面包屑和 URL,使用当前查询我不能一次全部提取它们。

除非我忽略了某些东西,否则 URL 需要像 script.php?album_id=1&album_id=3&album_id=6 这样才能抓住它们,就好像 1 是顶级,3 是子,6 是 3 的子一样。

我已经阅读了很多关于层次结构设置的文章,但大多数都是针对树层次结构布局的,我不需要为每个专辑一次显示所有专辑的子专辑,而更倾向于单个路径层次结构。

谢谢

编辑 我想我应该指出专辑名称可以命名任何东西,日期仅用于命名而不是实际时间戳等。对不起

4

3 回答 3

3

按照ianhales 的建议检索路径,但将其存储到数据库表中,然后从那里检索以显示。

所以将当前节点路径存入表中,只有在移动时,重命名节点才需要更新路径。

这种方式将更有效地读取。

于 2012-05-30T13:57:46.383 回答
2

如果我理解您的问题,您需要从叶子(例如“第 2 天”)到树根(专辑数据)的路径。

如果是这样,这个问题的答案应该是这样: mysql + php retrieve leaf children with path

于 2012-05-30T13:50:51.683 回答
1

考虑为专辑使用MPTT表,然后您可以随意命名它们并拥有无限/无限制的嵌套。然后,您可以通过 id 将图片添加到相册。您可以使用拖放界面管理此类表。它们适用于快速阅读,较慢的更新。

至于数据,
专辑表:album_id(mediumint/unsigned auto_increment),lft(mediumint/unsigned),rgt(mediumint/unsigned)album_name(tingtext?)
项目表:item_id(mediumint/unsigned auto_increment)item_album_id(mediumint/unsigned)item_name (varchar)
Mediumint,因为您可能会超过 65,000 个项目/专辑,但似乎不太可能超过 1600 万。

编辑:
如果你使用好的工具,你可以减少学习曲线。见http://mjsarfatti.com/sandbox/nestedSortable/https://github.com/mjsarfatti/nestedSortable方法提供给你需要存储在数据库中的值toArray()。你可以使用标准的 jQuery UIsortable()事件update来改变隐藏的输入。

选择树或其中的一部分,基本上是按left值排序。对于子树,您还可以将项目限制为具有left介于父级leftright值之间的项目。您还可以通过(相对)深度进行限制,例如depth <= parent_depth + number_of_levels_down.

要将您从 db 获得的平面列表显示为层次结构,您可以使用堆栈来记录前一项的深度。当您迭代项目时,您可以使用它来创建打开的 html 标记,当它变得更深时,并在深度减小时创建关闭标记。

于 2012-05-30T14:04:50.220 回答