我正在考虑如何将图像存储到我的数据库中。我有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
我应该创建另外两个交叉表" ALBUMS_USERS"和" ALBUMS_ANIMALS" ...它不可维护!我不能为2个或更多的宏实体"创建一个简单,优雅和优雅的数据库。怎么办?什么是最好的方式?
查询将如下:
我将使用amazon s3存储图像和相册。图像的路线是:
1 - 没有相册
我的桶应用内/ [用户|动物] - [idUsers |动物] / IMG / [文件名] - [宽度的图像] [延伸]
ex:my-bucket-app / user-1 / img / 1_102020304-400.jpg(400是图像长边的长度)
2 - 使用相册
我的桶应用内/ [用户|动物] - [idUsers |动物] /相册 - [idAlbum] / [文件名] - [宽度的图像] [延伸]
ex: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- 原始 .jpg
正是为什么我认为只将这部分图像的名称 1_102020304 -400.jpg存储到" filename"字段并添加大小和mimetype(这被记忆到另一个字段" mime_type")和一个函数。
答案 0 :(得分:1)
idGender tinyint(4) FK
idCountry tinyint(4) FK
不规范琐事;将CHAR(1) CHARACTER SET ascii
用于gender
。有标准的双字母国家代码。
name varchar(255)
不要被VARCHAR长度带走。
您尚未提及ENGINE - 使用InnoDB。
idUsers bigint(20)
您预期超过40亿(INT UNSIGNED
的限制)? INT是4个字节; BIGINT是8.更小更好。
在您的多对多映射( 必需)中,您可能需要一个指向相反方向的索引。
mime_type varchar(50)
简单的ENUM就足够了。
如果没有指定查询的内容,则无法最终确定架构。