最好的MySQL模型上传4种不同大小的图像

时间:2012-04-16 04:54:58

标签: php image

我正在开展一个主要关注照片的项目。我想上传同一张图片的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'。但是,我将无法记录版本图像的宽度和高度(只是主要图像)(我真的想要)。所以,也许这个模型不是最好的......或者可能是......

在我开始工作之前,我想我会问。我想从一个良好的脚开始,并有一个坚实的基础。

我是在正确的道路上吗?第二个模型是你要使用的吗? 我应该知道哪个更好的模型?

提前致谢

4 个答案:

答案 0 :(得分:2)

我肯定会选择第二名。它允许的灵活性,大小可用,而不会限制多少

答案 1 :(得分:1)

请同样考虑存储一个图像,然后使用像ImageMagick这样的工具动态调整大小:

http://php.net/manual/en/book.imagick.php

答案 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

猜猜这将是最简单的,并为您提供所需的所有灵活性。