繁体   English   中英

模型+数据库设计

[英]Models + Database design

我想要完成的事情:

  • 应该是单个或相册的图像
  • 可浏览的专辑列表和带有页码编号的单张图片
  • 在浏览时不显示相册内的图像,仅显示专辑封面

到目前为止,我的方法是:

  • 代表单个图像的模型和单个相册
  • 一个数据库表内容,包含id,title,thumbnailFile和imageFile等。
  • 一个数据库表专辑,包括专辑ID,专辑标题等。
  • 一个数据库表album_content映射哪些内容在哪个相册内
  • 一个数据库表浏览带有专辑的ID,内容不是专辑内的ID +用于缩略图预览和排序的复制属性(文件名,标题,视图,日期等)
  • Paginator仅使用后一个表,而视图使用指向内容表的模型

我不认为上面的速度太差了,但是我觉得它并不特别优雅,而且我正在寻找一种更好的方法来做到这一点,并希望减少缓存/无效的元素数量。 到目前为止,我一直在思考以下问题:

  1. 只有数据库中的一个数据副本(以某种方式组合内容,专辑和浏览,并且仍然能够按日期,视图等对数据集进行快速计数和排序)
  2. 按列排列任何可排序/订单的连接
  3. 将所有图像视为单个模型实例,也在相册内

我的主要问题是专辑有独立于其中的内容的日期,视图等,我希望按照不在专辑内的内容日期+应该具有唯一标识符的专辑日期进行排序。 相册也有与内容无关的列。

有没有好办法解决这个问题?

* 编辑 :对于速度,我认为我坚持使用单独的浏览表。 有没有办法让Zend dbTable引用浏览< - >专辑和内容的视图列,以便任一专辑或内容中的onUpdate使用Zend中的CASCADE逻辑更新两个表?

我会在后台编写代码:1张单张图片= 1张为单张的专辑。 因此,浏览单个图像与浏览相册相同。 唯一的区别是当您显示“单张图像”专辑或“普通”专辑时。 由于相册和单张图像都有一个代表内容(图像或封面)的图像,因此它具有敏感性。

表可能是这样的:

t_album (id, type, title, cover_id, ...)
t_image (id, link, thumbnail_id, ...)
t_album_contents (id_album, id_image, comments)

请注意,仅当图像可能位于多个相册中或者可能在同一个相册中多次时,才需要使用表格[t_album_contents]。 否则,该表可能会消失,并在表[t_image]中的[t_album]上替换为外键。

总是最好坚持使用标准化数据库(3NF),并根据您使用的DBMS进行运行时优化(仅在您必须时才违反3NF)...

再说一次,我不能说清楚这一点:避免以任何可接受的费用违反3NF

如果添加违反3NF的内容,请确保数据库的3NF部分在每种可能的情况下都保持完整...冗余的“复制属性”可能导致数据不一致,因此请确保冗余免费3NF部分中的数据你的模型有优先权......例如。 当服务器负载允许时,定期从3NF部件重建冗余部件,或者提供经过测试的更新模式,确保更新仅应用于3NF部件,并且3NF部件上的每次更新都会触发相应冗余数据的重建...这样的方法尝试在从数据库读取时出于性能等原因需要冗余数据时,尽量减少数据损坏的风险

从另一部分(通过命名空间/前缀/等)分离DB的3NF部分也是一个好主意

根据预期的请求(浏览请求数与更新/插入请求数),使用建议的方法和冗余数据是否合理。 在速度方面,不要低估正确的表索引。

对于比较(排序)与其他内容混合的专辑的问题:

为什么内容实体不能代表专辑? 一个专辑就像一个目录......它可以有子目录,这些子目录可以从目录的角度来看......如果以这种方式建模,你会将内容与内容进行比较......额外的属性,取决于特定的内容类型可以在另一个具有1:0-1关系的表中,而“common”可比较属性驻留在内容表中

另一方面,你可以使用一个联合vor,这理想情况下只会慢一点,但可以使两种类型的实体统一,以进行比较和排序......根据预期的请求,缓存这些排序的结果是有意义的每个可浏览的物体

我希望这个能有一点帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM