我正在为一所学校开展一个项目,其中一个特定的模块处理考勤系统。我正在使用LAMP(PHP 5.2+ MYSQL 5+)堆栈进行开发。现在学校的人数大约是1500人,每年的工作日总数大约是250人。此外,我要保留5年的记录才能删除。
表结构是
studentId varchar(12)
date date
fn varchar(1) *forenoon*
af varchar(1) *afternoon*
如果我只使用一个表,那意味着5年期间有1,875,000条记录。现在我没有考虑这样一个庞大的数据库,而是考虑为每个类(不是部分)创建一个表。所以考虑到有12个类,我将有12个表,这意味着每个表平均有1,55,000个记录,这是可管理的。
这是正确的方法吗?还是有更好的方法吗?
答案 0 :(得分:14)
您正在做的事情称为过早优化。这是一个常见的错误。
您最好将数据库结构与现实接近,如果需要优化或提高速度,您可以随时使用。
根据经验并查看您的示例,单表解决方案看起来很好。
答案 1 :(得分:3)
有几点。
您还没有真正提供足够的信息重新链接到其他表以及该表将存储的其他内容(如果有的话)。但是你应该从所有表开始使用3NF,只有在发现性能问题时才更改它。
答案 2 :(得分:2)
只要您正确索引表列,第一个表就不会有大问题。
我不同意将它分成12个类的想法,因为你无法保证它将保留它的方式(添加类,类合并等)。
为了获得效率的明显好处而搞砸你的数据库规范化是你应该只考虑极端情况(如果有的话)
答案 3 :(得分:2)
我建议没有必要拆分这张桌子。如果为可能需要执行的任何选择性查询创建适当的索引,系统应该能够非常快速地找到所需的行。即使对于涉及所有行的分析查询,200万个这样的记录也只需要一两秒来扫描,我想这不会是一个很大的问题。
MySQL现在还支持将数据分区作为可选功能。分区类似于您拆分表的提议,但它是在物理级别完成的,因此使用您的架构的用户或开发人员无法看到它。如果您发现单表实现仍然太慢,这可能是一种有用的方法。 This document概述了MySQL 5.4中的分区。
答案 4 :(得分:0)
校验,
我回应Michiel的意见,认为这是不成熟的优化。
以后基本上可以提高性能的是使用数据库归档和分区功能,以便您的数据库读取有效。我也可以在这个表上创建索引。无论如何我不相信100万条记录是巨大的。今天的数据库能够处理如此庞大的数字。此外,您将仅在3年后遇到性能问题
所以继续编写代码,而不是考虑出了什么问题!