我正在开展一个主要关注照片的项目。我想上传同一张图片的4个不同版本。
由于项目的性质,图像需要是最佳的,因此可以以最佳质量上传(最佳质量/尺寸比)。我将使用Photoshop创建4个图像的最佳质量/尺寸版本。换句话说,我不会在上传时使用PHP来调整图像大小。
对于所有4张图片,标题和说明与上传图片的日期相同。每个图片都有自己的宽度和高度属性(以便在html中输出图片时帮助浏览器)...
我提出了以下模型:
image (image_id, title, desc, filename_s, filename_s_width, filename_s_height, filename_m, filename_m_width, filename_m_height, filename_l, filename_l_width, filename_l_height, filename_xl, filename_xl_width, filename_xl_height, uploaded)
然后,考虑到上述模型未来不会扩展很多,我想到了以下模型:
image (image_id, title, desc, uploaded)
imagesize (size_id, size)
image_version (id, image_id, filename, width, height, size_id)
还有3个模型,包括上传主图像并在数据库中保存记录。对于该主图像的版本,在文件名中附加单词'_small','_ medium','_ alarge','_ xlarge'。但是,我将无法记录版本图像的宽度和高度(只是主要图像)(我真的想要)。所以,也许这个模型不是最好的......或者可能是......
在我开始工作之前,我想我会问。我想从一个良好的脚开始,并有一个坚实的基础。
我是在正确的道路上吗?第二个模型是你要使用的吗? 我应该知道哪个更好的模型?
提前致谢
答案 0 :(得分:2)
我肯定会选择第二名。它允许的灵活性,大小可用,而不会限制多少。
答案 1 :(得分:1)
请同样考虑存储一个图像,然后使用像ImageMagick这样的工具动态调整大小:
答案 2 :(得分:1)
你的第二个模型更好。
我可能对此模型进行的唯一调整是将filename
属性分隔为基本名称和后缀,并删除image_version
上不必要的ID:
CREATE TABLE imagesizes (
id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
size VARCHAR NOT NULL COMMENT 'e.g. small, large, thumbnail, original, etc',
suffix VARCHAR NOT NULL COMMENT 'e.g. _s, _l, _t, or nothing for no suffix',
UNIQUE KEY suffix (suffix),
UNIQUE KEY size (size)
);
CREATE TABLE images (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
basename VARCHAR NOT NULL COMMENT 'the base name of the image. Add suffixes to get a filename',
title VARCHAR NOT NULL,
desc VARCHAR NOT NULL,
uploaded_on DATETIME NOT NULL,
UNIQUE KEY basename (basename)
);
CREATE TABLE imagefiles (
image_id INTEGER UNSIGNED NOT NULL,
imagesize_id TINYINT UNSIGNED NOT NULL,
width INTEGER UNSIGNED NOT NULL,
height INTEGER UNSIGNED NOT NULL,
PRIMARY KEY (image_id, imagesize_id),
KEY imagesize_idx (imagesize_id),
CONSTRAINT image FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT imagesize FOREIGN KEY (imagesize_id) REFERENCES imagesizes (id) ON DELETE NO ACTION ON UPDATE CASCADE
);
然后您可以获得如下文件名:
SELECT CONCAT(image.basename, imagesizes.suffix) AS filename
FROM images INNER JOIN imagefiles ON images.id=imagefiles.id
INNER JOIN imagesizes ON imagefiles.imagesize_id=imagesizes.id;
对于普通情况,您应该将其包装在视图中并改为查询视图:
CREATE VIEW imagelist AS
SELECT images.id AS id, images.basename AS basename, images.title AS title, images.desc AS desc,
images.uploaded_on AS uploaded_on, imagefiles.width AS width, imagefiles.height AS height, imagesizes.id AS size_id,
imagesizes.size AS size, imagesizes.suffix AS suffix,
CONCAT(imagefiles.basename, imagesizes.suffix) AS filename;
答案 3 :(得分:0)
上传图片后,您可以使用getimagesize
功能获取图片尺寸:
http://php.net/manual/en/function.getimagesize.php
猜猜这将是最简单的,并为您提供所需的所有灵活性。