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

Mysql 如何改进存储图像的数据库?,mysql,database,database-design,database-schema,Mysql,Database,Database Design,Database Schema,我正在考虑如何将图像存储到数据库中。我有两个“宏实体”,用户和动物 用户 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 tin

我正在考虑如何将图像存储到数据库中。我有两个“宏实体”,用户和动物

用户

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
动物

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
IMG

idImg bigint(20) PK 
filename text 
created_time datetime 
mime_type varchar(50)
最简单的解决方案是创建一个交叉表users\u img和另一个交叉表animal\u img,但它看起来不是很优雅。像这样:

IMG\u用户

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
IMG_动物

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
这会很好,但如果我想在将来创造专辑的可能性,我不能这么做

对于相册,它很简单:

专辑

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
IMG\u专辑

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
idImg bigint(20) PK FK
idUsers bigint(20) PK FK
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) 
idImg bigint(20) PK FK
idAlbum bigint(20) PK FK
引擎InnoDB

我应该创建另外两个交叉表“ALBUMS\u USERS”和“ALBUMS\u ANIMALS”…它不可维护!我不能为2个或更多的“宏实体”创建一个简单、好、优雅的数据库。你怎么能做到?最好的办法是什么

查询如下:

  • 没有相册:“选择idUsers/idAnimals=X的所有图像”。当我访问用户(或他的动物)页面时,我想在一个部分中看到他的图像的缩略图
  • 对于相册:“选择idUsers/idAnimals=X的所有相册”。当我访问用户页面时,我希望看到他的相册的缩略图
我将使用AmazonS3存储图像和相册。图像的路径是:

1-没有专辑

我的bucket应用程序/[user | animal]-[idUsers | animals]/img/[filename]-[width of image]。[扩展名]

例如:my bucket app/user-1/img/1_10202034-400.jpg(400是图像长边的长度)

2-有相册

我的bucket应用程序/[user | animals]-[idUsers | animals]/[idAlbum]/[filename]-[width of image]。[扩展名]

例如:my bucket app/user-1/albums-1/1_10202034-400.jpg(400是图像长边的长度)

文件名由php中的此函数生成:

$userID . _ . md5(microtime());
我会将每个上传图像的4个图像存储到一个存储桶中。例:

1_1 0200304-400.jpg用于缩略图

1_1 0200304-2048.jpg用于大图像尺寸

1_1 0200304-1024.jpg用于中等大小的图像

1_1 02020304-原始图像.jpg用于原始图像

正因为如此,我才想到只将图像名称的这一部分1_10202034-400.jpg存储到“filename”字段中,并使用函数添加大小和mimetype(这被存储到另一个字段“mime\u type”)

idGender tinyint(4) FK
idCountry tinyint(4) FK
不要把琐碎的事情正常化;对
性别
使用
CHAR(1)字符集ascii
。有标准的两个字母的国家代码

name varchar(255)
不要被VARCHAR的长度冲昏头脑

您没有提到引擎——使用InnoDB

idUsers bigint(20)
您预计将超过40亿(不带符号的
INT的上限)
?INT为4字节;比金是8。越小越好

在多对多映射(这是必需的)中,可能需要一个反向的索引

mime_type varchar(50)
一个简单的枚举就足够了


如果不指定查询将是什么样子,就无法完成架构。

您好,有趣的阅读。我只是添加了更多关于查询的信息。你有什么建议?谢谢,所以木栅图像是一个图像。没有理由根据它是否在一个相册(或多个相册)中而采用不同的存储方式。使用数据库来组织相册,而不是目录系统。图像文件名的细节也是不必要的,除非你想让大小等对用户来说显而易见。谢谢你的回复。所以,一个表格“img”用于图像,一个表格“albums”用于相册。另一个表格是多对多的“img_专辑”,用于关联它们,但我不知道如何将它们关联到用户和动物。我必须创建另一个表“albums\u animals”和“albums\u users”?为什么您认为“albums\u users”和“albums\u animals”是必要的?如果有“IMG_用户”和“IMG_动物”可用,并且IMG和相册之间的映射是已知的(通过IMG_相册),您可以通过SELECT语句(假设您的FORREVIE密钥关系一致),确定哪个用户/动物在哪个相册中运行。您好,感谢回复!我只是在第一篇文章中添加了更多关于引擎和查询的信息。