背景
我是CS大学一年级的学生,我做兼职工作是我父亲的小生意。我没有在现实世界中进行应用程序开发的经验。我用Python编写了脚本,用C编写了一些课程,但没有这样的东西。
我父亲的培训业务不多,目前所有课程都通过外部网络应用程序进行计划,记录和跟进。有导出/“报告”功能,但是它非常通用,我们需要特定的报告。我们无权访问实际数据库来运行查询。我被要求设置一个自定义报告系统。
我的想法是创建通用的CSV导出,并将其导入(可能是使用Python)(每天晚上)到办公室中托管的MySQL数据库中,从那里我可以运行所需的特定查询。我没有数据库方面的经验,但了解非常基础的知识。我已经阅读了一些有关数据库创建和常规表单的信息。
我们可能很快就会有国际客户,因此如果发生这种情况,我希望数据库不会爆炸。我们目前也有几个大公司作为客户,分别设有不同的部门(例如ACME母公司,ACME医疗保健部门,ACME身体护理部门)
我提出的架构如下:
- 从客户的角度来看:
- 客户是主表
- 客户链接到他们工作的部门
- 部门可以分散在一个国家/地区:伦敦的HR,斯旺西的市场营销等。
- 部门与公司的部门联系在一起
- 部门链接到母公司
- 从类的角度来看:
- 会话是主表
- 老师链接到每个会话
- 每个会话均会获得一个statusid。例如0-已完成,1-已取消
- 会话被分组为任意大小的“包”
- 每个包装都分配给一个客户
- 会话是主表
我在一张纸上“设计”(更像是乱涂乱画)该架构,试图使其标准化为第三种形式。然后我把电源插头插上到MySQL Workbench和它使人们都非常适合我:
(点击查看全尺寸图片)
(来源:maian.org)
我将要运行的示例查询
- 哪些客户的信用额仍处于闲置状态(将来未安排课程的客户)
- 每个客户/部门/部门的出勤率是多少(由每个会话中的状态ID衡量)
- 一个月一个老师上了几节课
- 标记出勤率低的客户
- 针对人力资源部门的自定义报告以及部门人员的出勤率
问题
- 这是工程过度还是我朝着正确的方向前进?
- 对于大多数查询,需要联接多个表是否会对性能造成重大影响?
- 我已经向客户端添加了一个“ lastsession”列,因为它可能将是一个常见的查询。这是个好主意还是应该严格规范化数据库?
谢谢你的时间
divisions
有名为的列divisionid
。您不是觉得多余吗?随便命名id
。您的表的名称也包括_has_
:我会删除它,仅以它为名cities_departments
。您的DATETIME
列应该是类型,TIMESTAMP
除非它们是用户输入的值。我认为拥有cities
and countries
表格是个好主意。您可能会遇到麻烦,将表限制为一个表status
。考虑使用an INT
并对其进行按位比较-这样您可以在那里保留更多含义