Лучшая практика
1- Никогда не делай select *
;это анти-паттерн.
select * слишком много выбирает, выбирайте только те поля, которые вам нужны.
SELECT field1 [,field2][,field....] FROM images WHERE
2- username
не может быть полем в таблице images
;нарушает 1NF.
Поместите пользователей в отдельную таблицу:
table user
id unsigned integer not null primary key auto_increment,
-- id is a redundant key to speed up joins.
name varchar(255),
other_fields.....,
unique index ui_name (name) -- << make sure user.name is unique.
table image
id unsigned integer not null primary key auto_increment,
user_id unsigned integer not null,
image_blob blob,
foreign key fk_user_id (user_id) references user(id) on delete cascade on update cascade,
.....
3- Если вы соответствуете username
, убедитесь, что в этом поле есть unique index
поэтому повторяющиеся имена пользователей не могут существовать.
См. определение таблицы для user
выше.
Лучше ли хранить эти изображения в базе данных sql?
Лучше всего с точки зрения согласованности, потому что изображения будут попадать в режим ACID, поддерживаемый транзакциями в InnoDB.
Если вы храните изображения в файловой системе, трудно синхронизировать файловую систему сБД (если транзакция завершается неудачно или файл удаляется или перезаписывается, БД и файловая система не синхронизированы).
Кроме того, запись приложения в файловую систему, а также в БД открывает дополнительную проблему безопасности, котораяне существует, если приложение связывается только с БД.
С точки зрения производительности запись образа в файловую систему может быть быстрее.
Я бы порекомендовал записать в БД, но оставить открытой опцию записив файловую систему, если и когда происходит медлительность (но не раньше).
Это так просто, какSELECT image_blob from Images i
INNER JOIN user u ON (u.id = i.user_id) WHERE u.name = :userparam
Да, это так просто.