2011-04-16 90 views
0

我想要完成的任务:模型+数据库设计

  • 图片应该是单独或者专辑
  • 浏览的相册和配页单张照片编号
  • 不就表明内部专辑图片列表浏览,只是专辑封面

我的做法迄今已有:

  • 模型表示一个单一的图像,并且单个专辑
  • 一个数据库表中的内容包含ID,标题,thumbnailFile和镜像文件等
  • 一个数据库表专辑相册ID,相册标题等
  • 一个数据库表album_content映射哪些内容是里面有什么专辑
  • 一个数据库表的浏览与使用缩略图预览和排序(文件名,标题,视图,日期等),IDS的专辑,和IDS的内容不是内部专辑+复制属性
  • Paginator仅利用后者表格,而视图正在使用mo删除指向内容表

我不认为上面是关于速度太差,但我不觉得它特别优雅,我正在寻找一个更好的方式来做到这一点,并希望收缩要缓存/无效的元素数量。到目前为止,我一直线沿线的思考的东西:

  1. 只有其数据库中的数据的一个副本(合并内容,专辑和浏览不知何故,仍然能够quicly数和日期排序的数据集,意见等)
  2. 走就走由列在任何可排序/顺序加入
  3. 对待所有图像作为一个单一的模型实例,也在里面专辑

我在这里的主要问题是,专辑有日期,意见等等,不管它里面的内容是什么,我希望按照续约日期排序不在专辑内+专辑的日期应该有一个唯一的标识符。专辑也有colums与内容无关。

有没有解决这个问题的好方法?

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

+0

图像是否可以出现在多个相册中?一张图像既可以是单曲,也可以是专辑?一张图像可以在同一张专辑中多次出现?专辑可以没有图像吗?你想在同一个列表中浏览单张图片和相册吗? – Skrol29 2011-04-19 08:48:26

回答

2

我会在后台编码:1张单张图片= 1张专辑类型为单曲。因此浏览单个图像与浏览相册相同。唯一的区别是当您显示“单张图像”相册或“正常”相册时。 这使得sens,因为专辑和单幅图像都有一个图像代表内容(图像或封面)。

表可以是这样的:

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]上的外键代替。

0

这是百达一个好主意,坚持规范化的数据库(3NF)第一,并根据您使用DBMS的做运行时优化(3NF违反仅如果你需要的话)......

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

如果您添加了违反3NF的内容,请确保数据库的3NF部分在每种可能的情况下都保持完好无损。您的冗余“复制属性”可能导致数据不一致,因此请确保模型中无冗余冗余3NF部分的数据具有优先级。当服务器负载允许时,规则地从3NF部分重建冗余部分,或者提供经过测试的更新模式,确保更新仅适用于3NF部分,并且3NF部分的每个更新都会触发重建相应的冗余数据。像这样的方法试图最大限度地减少数据损坏的风险,当你需要冗余数据时,从数据库中读取性能等原因,同时从数据库中读取数据库的3NF部分与其他部分分离(命名空间/前缀/ etc)

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

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

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

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

我希望这有助于有点

+0

我尝试过使用联合方法,因为数据库在对数据集进行排序(如对其他表中的数据进行排序)之前为数据库创建临时表,所以这种联合方法速度要慢得多。我的浏览表或多或少是这个临时表的存储版本。 我看了一下关于触发器的mysql,但我不确定这是否是一个很好的方法来更新这个浏览表,保持逻辑脱离我的模型 – 2011-04-16 16:23:03

+0

所以你的DBMS是MySQL ......如果你想要保持缓存更新逻辑靠近数据库,您应该考虑处理更新和插入案例的存储过程......读取时,您的应用程序逻辑可以简单地使用缓存表(这可以在数据不一致的情况下轻松地重建) ),如果需要,也可以访问标准化数据...因为更新和插入仅限于存储过程,所以关于缓存更新只有一点需要注意 – DarkSquirrel42 2011-04-16 18:22:02