mysql - 如何改进存储图像的数据库?

标签 mysql database database-design database-schema

我在考虑如何将图像存储到我的数据库中。我有 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/

相关文章:

php - 数据库帮助 PHP 初学者

php - 自动插入日期

mysql - SQL按日期过滤器获取记录

mysql - 我是否应该对表进行非规范化,是否应该对 FK 列进行非规范化

sql - 如何避免数据库中出现 NULL,同时还代表缺失数据?

mysql - 使用常量列表值加快查询速度

Mysql查询从2个表中获取数据

database - 输出数据库数据并在 blade 模板 View laravel 中显示

sql-server - 数据库设计1对1关系

sql-server - 数据库中用于生成主键的表?