【发布时间】:2011-01-20 05:00:36
【问题描述】:
背景
我是 CS 一年级的学生,我在我父亲的小企业做兼职。我在现实世界的应用程序开发方面没有任何经验。我用 Python 写过脚本,用 C 写过一些课程,但没有这样的。
我父亲经营一家小型培训公司,目前所有课程都通过外部网络应用程序安排、记录和跟进。有一个导出/“报告”功能,但它非常通用,我们需要特定的报告。我们无权访问实际数据库来运行查询。我被要求建立一个自定义报告系统。
我的想法是创建通用 CSV 导出并将它们导入(可能使用 Python)到每晚托管在办公室的 MySQL 数据库中,我可以从中运行所需的特定查询。我没有数据库方面的经验,但了解非常基础的知识。我已经阅读了一些关于数据库创建和普通表单的内容。
我们可能很快就会开始拥有国际客户,所以我希望数据库在发生这种情况时不会爆炸。我们目前还有几家大公司作为客户,他们拥有不同的部门(例如 ACME 母公司、ACME 医疗保健部门、ACME 身体护理部门)
我想出的架构如下:
-
从客户的角度来看:
- Clients 是主表
- 客户与他们工作的部门相关联
- 部门可以分散在一个国家/地区:伦敦的人力资源部、斯旺西的营销部等。
- 部门与公司的部门相关联
- 部门与母公司相关联
-
从类的角度来看:
- Sessions 是主表
- 每节课都有一位教师
- 为每个会话提供一个 statusid。例如。 0 - 已完成,1 - 已取消
- 会话被分组为任意大小的“包”
- 每个包都分配给一个客户
- Sessions 是主表
我在一张纸上“设计”(更像是潦草)模式,试图将其规范化为第三种形式。然后我将它插入 MySQL Workbench,这一切对我来说都很漂亮:
(Click here for full-sized graphic)
(来源:maian.org)
我将运行的示例查询
- 哪些还剩学分的客户处于非活动状态(未来没有安排课程的客户)
- 每个客户/部门/部门的出勤率是多少(由每个会话中的状态 ID 衡量)
- 一个老师一个月有多少节课
- 标记出勤率低的客户
- 人力资源部门的自定义报告及其部门人员的出勤率
问题
- 这是过度设计还是我的方向正确?
- 大多数查询需要连接多个表会导致性能大幅下降吗?
- 我已经向客户端添加了一个“lastsession”列,因为它可能是一个常见的查询。这是个好主意还是我应该严格规范数据库?
感谢您的宝贵时间
【问题讨论】:
-
亲爱的 CS 一年级学生:请继续使用 StackOverflow。你的问题很有趣,写得很好,很有帮助。换句话说,您在提问者中排名前 1%。
-
一个部门可以包含其他部门吗?如果是这种情况,则可以使用“has”表将 Division 链接回包含它的 Division。
-
感谢 cmets 的好意 :) Mark 我将不得不再次查看该项目的文档,但我认为我们没有发现这种情况。感谢您指出。
-
我不喜欢你的主键命名约定。表
divisions具有名为divisionid的列。你不觉得那是多余的吗?只需将其命名为id。还有你的表名,包括_has_:我会删除它,然后将其命名为例如cities_departments。你的DATETIME列应该是TIMESTAMP类型,除非它们是用户输入的值。我认为拥有cities和countries表是个好主意。您可能会遇到将表限制为单个status的问题。考虑使用INT并对其执行按位比较 - 这样你就可以在那里拥有更多意义 -
@binnyb 关于using id as the name of the primary key 有很多争论,人们在决定之前应该考虑这些。
标签: mysql database database-design schema database-normalization