C # Image MySql Лучшая практика и обработка - PullRequest
0 голосов
/ 06 октября 2011

Быстрый вопрос:

Мы хотим иметь возможность сохранять изображение аватара пользователя для пользователей нашего чата, чтобы каждый, кто вошел в приложение, мог видеть это изображение в отношении пользователя. Это приложение IRC для чата winforms C #, которое проверяет подлинность пользователя в БД перед обработкой команд IRC.

По сути, мы хотим иметь возможность запрашивать изображение для пользователя из BLOB-объекта в базе данных и назначать это изображение элементу управления. Это позволит нам всем загружать аватар (если они того пожелают), и все видят это, а также свое имя пользователя в создаваемых нами карточках пользователей.

Лучше ли хранить эти изображения в базе данных sql? Я полагаю, что это не будет проблемой, учитывая, что они будут относительно небольшими изображениями (менее 64 КБ) и будут извлекаться и передаваться только по запросу пользователя из БД.

Вопрос в том, лучший ли это способ? И как мы могли бы сделать это, если бы мы использовали mySqlConnector. Это так же просто, как

Select * from Images Where Username='BLAH'

, а затем просто передать эти данные в виде потока изображения в графическое окно в C #?

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Лучшая практика

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 iINNER JOIN user u ON (u.id = i.user_id) WHERE u.name = :userparam

Да, это так просто.

0 голосов
/ 06 октября 2011

Я думаю, что Хранение образа в базе данных является лучшей идеей, оно может быть немного медленнее, но оно позволит вам обновлять изображение транзакционно и позволит упростить масштабируемость / высокую доступность / безопасность / резервное копирование

Вы правы, вы просто выбираете большой двоичный объект и помещаете его в байтовый массив, см .: добавление и получение изображения из базы данных доступа в C #

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...