快速提问:
我们希望能够为聊天用户存储用户头像图像,以便登录应用程序的每个人都可以看到该用户的图像。这是一个 C# winforms 聊天 IRC 应用程序,在处理 IRC 命令之前,它会针对用户的数据库进行身份验证。
本质上,我们希望能够从数据库中的 BLOB 查询用户的图像,并将该图像分配给控件。这将使我们能够让每个人上传头像(如果他们愿意),并且每个人都可以在我们创建的用户卡中看到该头像以及他们的用户名。
最好将这些图像存储在sql数据库中吗?我认为这不会是一个问题,因为它们是相对较小的图像(小于 64k),并且仅在用户从数据库请求时才拉取和传输。
问题是,这是最好的方法吗?而且,如果我们使用 mySqlConnector,我们该如何做到这一点呢?是不是这么简单
Select * from Images Where Username='BLAH'
然后将数据作为图像流传输到 C# 中的图片框?
最佳答案
最佳实践
1- 切勿选择*
;这是一种反模式。
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- 如果您匹配用户名
,请确保该字段具有唯一索引
,以便不存在重复的用户名。< br/>
请参阅上面 user
的表定义。
Is it best to store those images in the sql database?
从一致性的角度来看这是最好的,因为图像将属于 InnoDB 中事务强制执行的 ACID 制度。
如果将图像存储在文件系统中,则很难保持文件系统与数据库同步(如果事务失败,或者文件被删除或覆盖,则数据库和文件系统不同步)。
此外,让应用程序写入文件系统以及数据库会带来额外的安全问题,如果应用程序仅与数据库通信,则不存在该问题。
从性能的角度来看,将镜像写入文件系统可能会更快。
我建议写入数据库,但如果发生缓慢(但不之前),请保持打开写入文件系统的选项。
Is it as simple as
SELECT image_blob from Images i
INNER JOIN user u ON (u.id = i.user_id) WHERE u.name = :userparam
是的,就是这么简单。
关于C# Image MySql 最佳实践和处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7671621/