数据库设计是要时间效率还是空间效率。

水上冰石 2013-12-17 04:24:45
一个带有题库的在线考试系统,数据库里面有题库,试卷信息,考试信息三个模块。题库是有题目类型的,每张试卷可以选择任意数量的题库题目。现在的问题是由于 试卷-试题 联系表里记录了有关试题id(综合了试题类型和试题id),试卷id的关联,所以有关试卷的题目数是可以自动统计出来的。现在问题来了:既然我可以通过统计语句统计出试卷题目信息(试卷分数也如此),那么我还需要再在试卷表里记录试卷的题目数这一个字段吗?
说的简单点:能够通过统计语句查询出来的数据,是否需要再建立表字段进行记录。到底哪种方式更加符合实际应用的情况,我对时间效率和空间效率没有极端要求,主要考虑综合的效率,并且要考虑代码的易用性和可读性,经济性。
设计数据库严格按照一对一,一对多,多对多的要求来,可是用的时候并不感觉多大方便。由于没有经验,数据库应用摸着石头过河,很多东西可以用,但是不知道到底用的有没有问题,是不是有更好的解决方案。
...全文
482 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
水上冰石 2013-12-18
  • 打赏
  • 举报
回复
引用 15 楼 fcuandy 的回复:
合理的冗余是必须的。
嗯 还是多增加几个字段和表吧,要不逻辑关系太烦人了,查询也太麻烦。
LongRui888 2013-12-18
  • 打赏
  • 举报
回复
引用 14 楼 jiao_zg 的回复:
[quote=引用 13 楼 DBA_Huangzj 的回复:] 有些国外专家建议对于超过10个字符的类型,使用varchar/nvarchar会好一点,如果小于10个字符,使用定长比较好
嗯 一直用nvarchar(n) 然后自定义n大小,网上说nvarchar与java比较吻合[/quote] 如果你用的是中文字符,那么就建议 nvarchar,这个字符会占用2个字节
發糞塗牆 2013-12-18
  • 打赏
  • 举报
回复
倒不一定,不过要看需求,如果你的系统只在中国大陆使用,不用n开头的类型也行,这种类型存储空间翻倍
fcuandy 2013-12-18
  • 打赏
  • 举报
回复
合理的冗余是必须的。
水上冰石 2013-12-18
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
有些国外专家建议对于超过10个字符的类型,使用varchar/nvarchar会好一点,如果小于10个字符,使用定长比较好
嗯 一直用nvarchar(n) 然后自定义n大小,网上说nvarchar与java比较吻合
水上冰石 2013-12-18
  • 打赏
  • 举报
回复
引用 19 楼 feiazifeiazi 的回复:
这个总数经常用, 那就在 试卷 表加一个字段"试题总数",别去查了。
嗯 有好几个类似的字段,“试题总数”,“得分”等,增加之后感觉不是那么纠结了。以前总是以数据库角度考虑问题,尽量减少表,尽量减少字段,忘记了一点,还要尽量减少数据库的连接次数。谢谢啦,结贴
飞啊子 2013-12-18
  • 打赏
  • 举报
回复
这个总数经常用, 那就在 试卷 表加一个字段"试题总数",别去查了。
發糞塗牆 2013-12-17
  • 打赏
  • 举报
回复
有些国外专家建议对于超过10个字符的类型,使用varchar/nvarchar会好一点,如果小于10个字符,使用定长比较好
水上冰石 2013-12-17
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
数据类型是要控制好,不过说实在话除非你设计和业务都很好,不然很难做到,比如我以前给开发举例,如果使用datetime2而不是用datetime,几千万数据可能要多耗几百M的空间
嗯啊,数据类型确实不好控制,通常我就是先给个小的,不够用了再放大,哈哈 一旦记录条数多了,即使冗余一个字段也会有好多冗余啊。但是这个冗余和效率相比,该舍谁取谁,啊啊啊,头痛
水上冰石 2013-12-17
  • 打赏
  • 举报
回复
引用 2 楼 u010192842 的回复:
[quote=引用 楼主 jiao_zg 的回复:] 常用的数据量都会不断变大,每次都查会越来越慢~~~!
现在就是三四张表关联。试试设计的er图当时就不对,为什么会涉及到了这么多的表的联系。本来在线考试系统也不算太大点的系统
發糞塗牆 2013-12-17
  • 打赏
  • 举报
回复
数据类型是要控制好,不过说实在话除非你设计和业务都很好,不然很难做到,比如我以前给开发举例,如果使用datetime2而不是用datetime,几千万数据可能要多耗几百M的空间
水上冰石 2013-12-17
  • 打赏
  • 举报
回复
引用 2 楼 u010192842 的回复:
[quote=引用 楼主 jiao_zg 的回复:]
我的问题就是
引用 8 楼 yupeigu 的回复:
[quote=引用 7 楼 jiao_zg 的回复:] [quote=引用 6 楼 yupeigu 的回复:] [quote=引用 4 楼 jiao_zg 的回复:]嗯,对,如果你的数据库经常有插入、删除、更新,那么日志文件可能比你的数据库文件,增长的更快,这个时候,就需要截断日志空间。
那以后还需要注意一下这块内容,谢啦,学习了
LongRui888 2013-12-17
  • 打赏
  • 举报
回复
引用 7 楼 jiao_zg 的回复:
[quote=引用 6 楼 yupeigu 的回复:] [quote=引用 4 楼 jiao_zg 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:] 现代系统往往都是以空间换时间,因为客户不会在乎你用了多少磁盘,而是在乎你的程序响应速度
还有一个空间的概念,就是服务器空间。服务器空间是放在租用的服务器上,考虑经济方面,空间还是不大,而数据库也是放在租用服务器上。在这种情况下呢?[/quote] 这个就得靠合理的设计,比如你的字段,多用varchar类型,少用char类型,能是numeric(10,2)的就不要写成numerical(20,2)能省一点是一点。 另外,如果你的数据库的日志比较大,那么可以手动截断日志,来减少占用的磁盘空间[/quote] 说的不好听一点,我这个人就是比较抠,所以一直在控制着数据类型方面的空间量,这个问题倒还好。就是有些字段到底是需要有呢还是不需要有呢?经常问自己:这个可以有吗?然后自己迷茫好长时间。可以统计查询的字段就是这种问题最经常出现的。 日志文件不太懂,也需要严格控制吗[/quote] 嗯,对,如果你的数据库经常有插入、删除、更新,那么日志文件可能比你的数据库文件,增长的更快,这个时候,就需要截断日志空间。
水上冰石 2013-12-17
  • 打赏
  • 举报
回复
引用 6 楼 yupeigu 的回复:
[quote=引用 4 楼 jiao_zg 的回复:] [quote=引用 1 楼 DBA_Huangzj 的回复:] 现代系统往往都是以空间换时间,因为客户不会在乎你用了多少磁盘,而是在乎你的程序响应速度
还有一个空间的概念,就是服务器空间。服务器空间是放在租用的服务器上,考虑经济方面,空间还是不大,而数据库也是放在租用服务器上。在这种情况下呢?[/quote] 这个就得靠合理的设计,比如你的字段,多用varchar类型,少用char类型,能是numeric(10,2)的就不要写成numerical(20,2)能省一点是一点。 另外,如果你的数据库的日志比较大,那么可以手动截断日志,来减少占用的磁盘空间[/quote] 说的不好听一点,我这个人就是比较抠,所以一直在控制着数据类型方面的空间量,这个问题倒还好。就是有些字段到底是需要有呢还是不需要有呢?经常问自己:这个可以有吗?然后自己迷茫好长时间。可以统计查询的字段就是这种问题最经常出现的。 日志文件不太懂,也需要严格控制吗
LongRui888 2013-12-17
  • 打赏
  • 举报
回复
引用 4 楼 jiao_zg 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:] 现代系统往往都是以空间换时间,因为客户不会在乎你用了多少磁盘,而是在乎你的程序响应速度
还有一个空间的概念,就是服务器空间。服务器空间是放在租用的服务器上,考虑经济方面,空间还是不大,而数据库也是放在租用服务器上。在这种情况下呢?[/quote] 这个就得靠合理的设计,比如你的字段,多用varchar类型,少用char类型,能是numeric(10,2)的就不要写成numerical(20,2)能省一点是一点。 另外,如果你的数据库的日志比较大,那么可以手动截断日志,来减少占用的磁盘空间
發糞塗牆 2013-12-17
  • 打赏
  • 举报
回复
如果数据量是不可减少的话,放在库内还是放在磁盘中,结果都是一样的,但是放在磁盘,一般来说你就需要额外地多管理一个东西
水上冰石 2013-12-17
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
现代系统往往都是以空间换时间,因为客户不会在乎你用了多少磁盘,而是在乎你的程序响应速度
还有一个空间的概念,就是服务器空间。服务器空间是放在租用的服务器上,考虑经济方面,空间还是不大,而数据库也是放在租用服务器上。在这种情况下呢?
LongRui888 2013-12-17
  • 打赏
  • 举报
回复
还是优先考虑性能把。 因为,硬盘现在很便宜,多存储点,也不会占用太大的空间。 相对应的,性能是只要考虑的问题,性能不好,查询速度就会比较慢,而且还容易导致其他的问题。
Yole 2013-12-17
  • 打赏
  • 举报
回复
引用 楼主 jiao_zg 的回复:
一个带有题库的在线考试系统,数据库里面有题库,试卷信息,考试信息三个模块。题库是有题目类型的,每张试卷可以选择任意数量的题库题目。现在的问题是由于 试卷-试题 联系表里记录了有关试题id(综合了试题类型和试题id),试卷id的关联,所以有关试卷的题目数是可以自动统计出来的。现在问题来了:既然我可以通过统计语句统计出试卷题目信息(试卷分数也如此),那么我还需要再在试卷表里记录试卷的题目数这一个字段吗? 说的简单点:能够通过统计语句查询出来的数据,是否需要再建立表字段进行记录。到底哪种方式更加符合实际应用的情况,我对时间效率和空间效率没有极端要求,主要考虑综合的效率,并且要考虑代码的易用性和可读性,经济性。 设计数据库严格按照一对一,一对多,多对多的要求来,可是用的时候并不感觉多大方便。由于没有经验,数据库应用摸着石头过河,很多东西可以用,但是不知道到底用的有没有问题,是不是有更好的解决方案。
常用的我一般是都记录到表里,便于查询。 不常用的有的时候会通过sql语句查出来显示....(基本没有不常用的) 常用的数据量都会不断变大,每次都查会越来越慢~~~!
發糞塗牆 2013-12-17
  • 打赏
  • 举报
回复
现代系统往往都是以空间换时间,因为客户不会在乎你用了多少磁盘,而是在乎你的程序响应速度

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧