模型+数据库设计


Models + Database design

我想要完成的任务:

  • 应为单个或相册中的图像
  • 相册和单张图片的可浏览列表(带页码(
  • 浏览时不显示相册中的图像,仅显示相册封面

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

  • 表示单个图像和单个相册的模型
  • 一个数据库表内容,包含id、title、thumbnailFile和imageFile等
  • 一个数据库表相册,包括相册id、相册标题等
  • 一个数据库表album_content映射相册中的内容
  • 一个数据库表浏览,其中相册的ID和不在相册内的内容的ID+用于缩略图预览和排序的复制属性(文件名、标题、视图、日期等(
  • 分页器仅使用后一个表,而视图则使用指向内容表的模型

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

  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关系的表中,而"通用"可比较属性则位于内容表中

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

我希望这能对有所帮助