我在考虑如何将图像存储到我的数据库中。我有 2 个“宏实体”,用户和动物。
用户
idUsers bigint(20) AI PK
name varchar(255)
surname varchar(255)
birthdate date
email varchar(250)
psw varchar(128)
tk int(11)
created_time datetime
mod_time datetime
idCategory tinyint(4) FK
idCountry tinyint(4) FK
idGender tinyint(4) FK
description text
动物
idAnimals bigint(20) AI PK
name varchar(255)
idGender tinyint(4) FK
idUsers bigint(20) FK
birthdate date
visits int(11)
identification varchar(200)
idBreed smallint(6) FK
created_time datetime
mod_time datetime
description text
IMG
idImg bigint(20) PK
filename text
created_time datetime
mime_type varchar(50)
最简单的解决方案是创建一个交叉表users_img 和另一个交叉表animal_img,但它看起来不是很优雅。像这样:
IMG_USERS
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
IMG_ANIMALS
idImg bigint(20) PK FK
idAnimals bigint(20) PK FK
它会很好用,但如果我想在未来提供制作专辑的可能性,我做不到。
对于相册来说很简单:
相册
idAlbums bigint(20) AI PK
name varchar(255)
descriptions text
created_time datetime
modified_time datetime
slug varchar(255)
IMG_ALBUMS
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
引擎 InnoDB
我应该再创建 2 个交叉表“ALBUMS_USERS”和“ALBUMS_ANIMALS”……它不可维护!我无法为 2 个或更多“宏实体”创建一个简单、良好和优雅的数据库。怎么办?什么是最好的方法?
查询将是这样的:
- 没有相册:“选择 idUsers/idAnimals = X 的所有图像”。当我访问用户(或他的动物)页面时,我希望在一个部分中看到他的图像的缩略图。
- 对于相册:“选择 idUsers/idAnimals = X 的所有相册”。当我访问用户的页面时,我希望看到他的相册的缩略图。
我将使用 amazon s3 来存储图像和相册。图像的路径是:
1 - 没有相册
my-bucket-app/[user|animal]-[idUsers|animals]/img/[filename]-[width-of-image].[extension]
例如:my-bucket-app/user-1/img/1_102020304-400.jpg(400是图片长边的长度)
2 - 有相册
my-bucket-app/[user|animals]-[idUsers|animals]/album-[idAlbum]/[filename]-[width-of-image].[extension]
例如:my-bucket-app/user-1/albums-1/1_102020304-400.jpg(400是图片长边的长度)
文件名由 php 中的这个函数生成:
$userID . _ . md5(microtime());
我会将每张上传图片的 4 张图片存储到一个存储桶中。例如:
1_102020304-400.jpg 缩略图
1_102020304-2048.jpg 大图尺寸
1_102020304-1024.jpg 中号图片
1_102020304-original.jpg 原图
正是为什么我想只将图像名称 1_102020304-400.jpg 的这一部分存储到“文件名”字段中,并添加大小和 mimetype(这被记住到另一个字段“mime_type”中)功能。
最佳答案
idGender tinyint(4) FK
idCountry tinyint(4) FK
不要把琐碎的事情规范化;使用 CHAR(1) CHARACTER SET ascii
作为 gender
。有标准的 2 个字母的国家/地区代码。
name varchar(255)
不要被 VARCHAR 长度冲昏头脑。
您没有提到引擎——使用 InnoDB。
idUsers bigint(20)
您期望超过 40 亿(INT UNSIGNED
的限制)? INT是4个字节; BIGINT 为 8。越小越好。
在您的多对多映射中( 是必需的),您可能需要一个相反方向的索引。
mime_type varchar(50)
一个简单的 ENUM 就足够了。
如果不指定查询的内容,您就无法最终确定架构。
关于mysql - 如何改进存储图像的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082551/