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


best MySQL model to upload 4 different sizes of an 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"、"_large"、"_xlarge"等词。但是,我将无法记录版本图像的宽度和高度(只是主要图像)(我真的很想要)。所以,也许那个模型不是最好的...或者也许是...

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

我走在正确的道路上吗?第二个模型是您将使用的模型吗?有没有更好的模型,我应该知道?

提前致谢

我肯定会选择第二个。它允许灵活地提供哪些尺寸,而不会限制数量

您的第二个模型更好。

我可能对这个模型进行的唯一调整是将 filename 属性分为 basename 和后缀,并删除 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;

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

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

上传图片后,您可以使用getimagesize函数获取图片尺寸:

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

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