最近在做一个大作业----开发一个 文件资源共享的C/S模式的小软件。
基本功能有1.上传到服务器共享,
2.上传到服务器做为私有资源(别人不能下载的)
3.下载各种资源。
我打算用IOCP这种模型来做这个。应为貌似它有TransmiteFile这种函数适合传文件。
/*===================================================================================*/
现在对服务器数据库设计问题有困惑。下面是我要做的数据库表格。下面是描述+问题。
1.首先数据库中维护一张用户基本信息表,属性有: 用户名,密码,积分,排名,注册时间。这个表格简单嘛!绿色的是主键。(积分排名完全是受CSDN影响而设计上去的, )
2.因为用户可以上传视频file,音乐file,学习file,所以又要维护3张表格,这3张表格主键,属性都一样,分别是 文件编号,文件名,文件描述,上传者用户名,下载次数。
问题2.1:有没必要再维护一张总表呢,就是这3个表格的总和,既有视频file又有音乐file,又有学习file。或者说是设计成只有总表而没有分成这3个表。(个人觉得表格只有一张速度慢)
问题2.2:最终放文件的路径是
E:/服务器文件夹管理/视频/
E:/服务器文件夹管理/音乐/
E:/服务器文件夹管理/学习/
E:/服务器文件夹管理/用户私人文件/用户名1/ 这里保存用户上传的私人文件
E:/服务器文件夹管理/用户私人文件/用户名2/ 同上
这样子设计是否合理??(感觉这个问题跟没问一样,干脆就把这条问题当成是我的描述吧。)
3.打算用户注册一个号,就在服务器数据库给他 动态分配3张表格---分别是上传之私人资源的file相关信息,
还有上传至共享file资源的相关信息,最后是下载的file的相关信息。表格的命名我会以用户名+标识符来命名
问题3.1:这样会不会导致表格数量太多不容易管理??类似这种数据库是否是这样设计的?
问题提出后,也感到稍微清晰了点,请大伙多多指教!给点意见参考。
14 个解决方案
#1
不建议注册用户的时候建新表,所有的文件可以都放在一张表中,数据库的大数据处理能力还是很强的,可以不用太早考虑这个优化。
文件的上传和下载推荐用FTP的方式。
文件的上传和下载推荐用FTP的方式。
#2
版主大人的意思是说没有必要分成视频,音乐,学习三类了么?但是当客户端点击 “音乐按钮” 时服务器应当回复这个音乐表格上的所有信息。如果分了类,就可以直接把音乐表格的纪录通通打包然后传回来。假如没有分类,那么就得循环“所有文件的每条记录”GetCollect()判断是否是音乐型。 其实创建这3张表我是不怕的。问题是用户的下载历史纪录如果设置成一个客户一张表感觉确实不太好!但如果把所有用户的下载纪录放在一张表,当用户访问自己的历史纪录时,貌似没有主键了,组合主键可以是 用户名+下载文件编号 。
#3
在加一个字段,表示文件类型,查询的时候用WHERE语句限制来获取相应的记录,不要全部获取。
查询历史的话不是有个字段标识了下载次数的吗?在WHERE子句中加个限制查询下就出来了。
查询历史的话不是有个字段标识了下载次数的吗?在WHERE子句中加个限制查询下就出来了。
#4
第一句我看明白了,SQL可以用where过滤,这个不错。再多的记录用个where就轻松能够得到想得到的记录。
第二句的话没明白,其实我说的下载次数是就像CSDN里的资源 被下载的次数。
第二句的话没明白,其实我说的下载次数是就像CSDN里的资源 被下载的次数。
#5
file表加多一个字段 文件类型 就可以了
历史表一般按时间分拆为当前表和历史表
当前表保留最新一段时间,如3个月前至今
而超过3个月的数据则移到历史表
善用数据库的功能,如表分区等
大型数据库处理千万级数据还是可以的
历史表一般按时间分拆为当前表和历史表
当前表保留最新一段时间,如3个月前至今
而超过3个月的数据则移到历史表
善用数据库的功能,如表分区等
大型数据库处理千万级数据还是可以的
#6
把所有用户的下载记录放在一张表里是不是若不自己加一个属性,如操作编号,就是没有主键,一个表没主键怕不怕啊?
#7
没有主键就是不方便更新和删除,最好是加个主键字段。
#8
这个表有个外键 对应于用户表的主键
看情况建索引
不一定只有主键
主键一般用于修改和删除
#9
你们说的对!虽然第一次听说,但觉得是对的!
select* from tablehistory where username=‘绿’ 这样就可以得到所有的绿的操作记录了。
另外我下了SQL server 2008 和Access 。使用方法都是一样的吗?
select* from tablehistory where username=‘绿’ 这样就可以得到所有的绿的操作记录了。
另外我下了SQL server 2008 和Access 。使用方法都是一样的吗?
#10
我说的使用方法是VC上的数据库编程。
#12
既然对于不同分类的
文件信息数用一张表格可以搞定,那么对于
保存路径来说
E:/服务器文件夹管理/视频/
E:/服务器文件夹管理/音乐/
E:/服务器文件夹管理/学习/
我想用到这个的地方主要还是当客户端请求下载某个编号的文件时,服务器根据编号来遍历整个E:/服务器文件夹管理下的文件名,找到了就传给客户。假如编号是1开头就去视频那里找,加入编号是2开头,就去音乐文件夹那找。3就去学习目录下找。
这样子和 直接E:/服务器文件夹管理 哪种又会更有效率和方便?(这种就不需要判断编号开头了)
E:/服务器文件夹管理/视频/
E:/服务器文件夹管理/音乐/
E:/服务器文件夹管理/学习/
我想用到这个的地方主要还是当客户端请求下载某个编号的文件时,服务器根据编号来遍历整个E:/服务器文件夹管理下的文件名,找到了就传给客户。假如编号是1开头就去视频那里找,加入编号是2开头,就去音乐文件夹那找。3就去学习目录下找。
这样子和 直接E:/服务器文件夹管理 哪种又会更有效率和方便?(这种就不需要判断编号开头了)
#13
数据表中也存放文件的存放路径。
不考虑移植性的话存绝对路径,考虑的话用配置保存“E:/服务器文件夹管理”路径,存相对路径。
不考虑移植性的话存绝对路径,考虑的话用配置保存“E:/服务器文件夹管理”路径,存相对路径。
#14
谢谢你们!我想可以结贴了!第一次发帖。
#1
不建议注册用户的时候建新表,所有的文件可以都放在一张表中,数据库的大数据处理能力还是很强的,可以不用太早考虑这个优化。
文件的上传和下载推荐用FTP的方式。
文件的上传和下载推荐用FTP的方式。
#2
版主大人的意思是说没有必要分成视频,音乐,学习三类了么?但是当客户端点击 “音乐按钮” 时服务器应当回复这个音乐表格上的所有信息。如果分了类,就可以直接把音乐表格的纪录通通打包然后传回来。假如没有分类,那么就得循环“所有文件的每条记录”GetCollect()判断是否是音乐型。 其实创建这3张表我是不怕的。问题是用户的下载历史纪录如果设置成一个客户一张表感觉确实不太好!但如果把所有用户的下载纪录放在一张表,当用户访问自己的历史纪录时,貌似没有主键了,组合主键可以是 用户名+下载文件编号 。
#3
在加一个字段,表示文件类型,查询的时候用WHERE语句限制来获取相应的记录,不要全部获取。
查询历史的话不是有个字段标识了下载次数的吗?在WHERE子句中加个限制查询下就出来了。
查询历史的话不是有个字段标识了下载次数的吗?在WHERE子句中加个限制查询下就出来了。
#4
第一句我看明白了,SQL可以用where过滤,这个不错。再多的记录用个where就轻松能够得到想得到的记录。
第二句的话没明白,其实我说的下载次数是就像CSDN里的资源 被下载的次数。
第二句的话没明白,其实我说的下载次数是就像CSDN里的资源 被下载的次数。
#5
file表加多一个字段 文件类型 就可以了
历史表一般按时间分拆为当前表和历史表
当前表保留最新一段时间,如3个月前至今
而超过3个月的数据则移到历史表
善用数据库的功能,如表分区等
大型数据库处理千万级数据还是可以的
历史表一般按时间分拆为当前表和历史表
当前表保留最新一段时间,如3个月前至今
而超过3个月的数据则移到历史表
善用数据库的功能,如表分区等
大型数据库处理千万级数据还是可以的
#6
把所有用户的下载记录放在一张表里是不是若不自己加一个属性,如操作编号,就是没有主键,一个表没主键怕不怕啊?
#7
没有主键就是不方便更新和删除,最好是加个主键字段。
#8
这个表有个外键 对应于用户表的主键
看情况建索引
不一定只有主键
主键一般用于修改和删除
#9
你们说的对!虽然第一次听说,但觉得是对的!
select* from tablehistory where username=‘绿’ 这样就可以得到所有的绿的操作记录了。
另外我下了SQL server 2008 和Access 。使用方法都是一样的吗?
select* from tablehistory where username=‘绿’ 这样就可以得到所有的绿的操作记录了。
另外我下了SQL server 2008 和Access 。使用方法都是一样的吗?
#10
我说的使用方法是VC上的数据库编程。
#11
差不多的,简单SQL语句的话看
这个。
#12
既然对于不同分类的
文件信息数用一张表格可以搞定,那么对于
保存路径来说
E:/服务器文件夹管理/视频/
E:/服务器文件夹管理/音乐/
E:/服务器文件夹管理/学习/
我想用到这个的地方主要还是当客户端请求下载某个编号的文件时,服务器根据编号来遍历整个E:/服务器文件夹管理下的文件名,找到了就传给客户。假如编号是1开头就去视频那里找,加入编号是2开头,就去音乐文件夹那找。3就去学习目录下找。
这样子和 直接E:/服务器文件夹管理 哪种又会更有效率和方便?(这种就不需要判断编号开头了)
E:/服务器文件夹管理/视频/
E:/服务器文件夹管理/音乐/
E:/服务器文件夹管理/学习/
我想用到这个的地方主要还是当客户端请求下载某个编号的文件时,服务器根据编号来遍历整个E:/服务器文件夹管理下的文件名,找到了就传给客户。假如编号是1开头就去视频那里找,加入编号是2开头,就去音乐文件夹那找。3就去学习目录下找。
这样子和 直接E:/服务器文件夹管理 哪种又会更有效率和方便?(这种就不需要判断编号开头了)
#13
数据表中也存放文件的存放路径。
不考虑移植性的话存绝对路径,考虑的话用配置保存“E:/服务器文件夹管理”路径,存相对路径。
不考虑移植性的话存绝对路径,考虑的话用配置保存“E:/服务器文件夹管理”路径,存相对路径。
#14
谢谢你们!我想可以结贴了!第一次发帖。