C# C映像MySql最佳实践和处理

C# C映像MySql最佳实践和处理,c#,mysql,image,C#,Mysql,Image,快速问题: 我们希望能够为我们的聊天用户存储用户化身图像,以便登录到应用程序的每个人都可以看到该用户的图像。这是一个WinC winforms聊天IRC应用程序,在处理IRC命令之前,它针对用户的DB进行身份验证 本质上,我们希望能够从数据库中的BLOB中为用户查询图像,并将该图像分配给控件。这将允许我们让每个人上传一个头像,如果他们愿意的话,每个人都可以在我们正在创建的用户卡中看到这个头像以及他们的用户名 最好将这些图像存储在sql数据库中吗?考虑到它们是小于64k的相对较小的图像,并且只有当

快速问题:

我们希望能够为我们的聊天用户存储用户化身图像,以便登录到应用程序的每个人都可以看到该用户的图像。这是一个WinC winforms聊天IRC应用程序,在处理IRC命令之前,它针对用户的DB进行身份验证

本质上,我们希望能够从数据库中的BLOB中为用户查询图像,并将该图像分配给控件。这将允许我们让每个人上传一个头像,如果他们愿意的话,每个人都可以在我们正在创建的用户卡中看到这个头像以及他们的用户名

最好将这些图像存储在sql数据库中吗?考虑到它们是小于64k的相对较小的图像,并且只有当用户从数据库请求时才会被提取和传输,我认为这不会是一个问题

问题是,这是最好的方法吗?而且,如果我们使用mySqlConnector,我们怎么能做到这一点呢。有这么简单吗

Select * from Images Where Username='BLAH'
然后将数据作为图像流传输到C中的图片框?

最佳实践

1-切勿选择*;这是一种反模式。 选择*选择太多,只选择您需要的字段

SELECT field1 [,field2][,field....] FROM images WHERE 
2-用户名不能是表图像中的字段;这违反了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-如果用户名匹配,请确保该字段上有唯一索引,这样就不会存在重复的用户名。 请参见上面用户的表定义

最好将这些图像存储在sql数据库中吗

从一致性的角度来看,这是最好的,因为映像将属于InnoDB中事务强制执行的ACID机制。 如果将映像存储在文件系统中,那么如果事务失败,或者文件被删除或覆盖,并且数据库和文件系统不同步,则很难使文件系统与数据库保持同步。 此外,让应用程序写入文件系统和数据库会带来额外的安全问题,如果应用程序只与数据库通信,则不存在这种问题

从性能的角度来看,将映像写入文件系统可以更快。 我建议您写入数据库,但在速度变慢时(而不是之前)保持打开写入文件系统的选项

有这么简单吗 从图像i中选择图像\u blob u.id=i.user\u id上的内部联接用户u,其中u.name=:userparam


是的,就是这么简单。

我认为将映像存储在数据库中是最好的主意,它可能会稍微慢一点,但它允许您以事务方式更新映像,并允许更简单的可扩展性/高可用性/安全性/备份

您是对的,只需选择blob并将其转储到字节数组中,
请看:

我只希望我能像你写的lol那样善于理解DB。你能解释一下最后的表达吗?我想我了解其中的大部分;除了“from Images i”和“=:userparam”部分之外。@zackrspv,Images我指的是查询表图像,但在查询中简称为i。这被称为别名,它允许您两次引用同一个表,它保存了击键,并且使查询更易于阅读。@zackrspv,userparam是用户参数的占位符;从安全性和性能的角度来看,这不是一个好主意,而不是在查询中插入一个文本,而是使用params。Google+PDO+C+MySQL获取更多信息取而代之的是,我将URI路径存储在数据库中,并允许程序根据数据库中的内容自动下载URI;这样,数据可以在本地缓存,图像框可以很好地更新。@zackrspv,REPLACE INTO image ii id,user\u id,image\u blob SELECT i.id,u.id?从图像i右键加入用户u ON u.id=i.user\u id,其中u.username=?限制1?1=imageblob,?2=用户名。