【问题标题】:best MySQL model to upload 4 different sizes of an image上传 4 种不同尺寸图像的最佳 MySQL 模型
【发布时间】:2012-04-16 04:54:58
【问题描述】:

我正在做一个主要关注照片的项目。我想上传同一张图片的 4 个不同版本。

由于项目的性质,图像需要是最佳的,因此需要以最佳质量(最佳质量/尺寸比)上传。我将使用 Photoshop 创建 4 张图像的最佳质量/尺寸版本。换句话说,我不会在上传时使用 PHP 来调整图片大小。

对于所有 4 张图片,标题说明都是相同的,即图片上传的日期。每张图片都会有自己的widthheight属性(以帮助浏览器在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”、“_large”、“_xlarge”附加到文件名。但是,我将无法记录版本图像的宽度和高度(只是主要的)(我真的想要)。所以,也许那个模型不是最好的……或者它是……

我想在我开始这个项目之前我会问一下。我想从一个好的开始,并有一个坚实的基础。

我在正确的道路上吗?您会使用第二种型号吗? 有没有更好的模型我应该知道?

提前致谢

【问题讨论】:

    标签: php image


    【解决方案1】:

    我肯定会选择第二个。它允许灵活地选择哪些尺寸可用,而不限制有多少

    【讨论】:

    • 我认为我在正确的道路上......第二个模型似乎是一个不错的
    【解决方案2】:

    你的第二个模型更好。

    我可能对这个模型做的唯一调整是将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】:

    也请考虑存储一个图像,然后使用 ImageMagick 等工具即时调整其大小:

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

    【讨论】:

    • 已考虑并拒绝。 “我将使用 Photoshop 创建……这 4 张图像。”
    • 虽然 OP 不认为它是一种选择,但对于愿意接受选择的人来说,这是一个非常、非常的好选择。我创建了很多带有画廊的网站,并使用按需调整图像大小。当客户说“对不起,但布局已经改变(再次!),我们需要标题中的宽屏照片,200x150 缩略图,400x300 媒体,......”,我的回答是“没问题”。
    • @Ignacio Vazquez-Abrams - 你可以使用任何你想“创建”图像的东西。我建议只存储一次,然后即时调整它的大小。而 ImageMagick 恰好非常擅长动态调整图像大小。恕我直言...
    【解决方案4】:

    上传图片后,可以通过getimagesize函数获取图片尺寸:

    http://php.net/manual/en/function.getimagesize.php

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

    【讨论】:

    • 我认为他此时正在回答您的问题:但是,我将无法记录图像的宽度和高度(这是我真正想要的)
    • 我知道如何获取上传照片的大小和其他元数据...我想说的是,如果我使用第三个模型,我不会有宽度和高度其他版本的图像,只是主要的......
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    相关资源
    最近更新 更多