背景

我是第一年客户服务学生,工作部分时间为我爸爸的小型企业。我没有任何体验现实世界的应用程序开发中。我编写了脚本,在 Python,在 C 中,一些相关的课程,但不像这样。

我爸爸有小型的培训业务,目前计划、 记录和通过外部 web 应用程序的后续工作的所有类。没有导出 /"隶属"的功能,但它是非常通用的并且我们需要具体的报告。我们没有对实际的数据库执行查询的访问。我已经被要求设置一个自定义的报告系统。

我的想法是创建泛型的 CSV 导出和 (可能使用 Python) 将其导入承载在办公室每个晚上,我可以运行所需的特定查询的 MySQL 数据库。在数据库中没有经验,但最基础的地方了解。我了解到一些有关数据库创建和范式。

我们可能开始出现国际客户很快,所以我希望数据库不分解是否/何时发生的。我们当前还具有几个大公司作为客户端,与不同的部门 (例如 ACME 总公司、 ACME 医疗保健部门,ACME bodycare 除法)

我已经想出了与该架构将为以下︰

  1. 从客户端角度来看︰
    • 客户端是主表
    • 客户端链接到他们工作的部门
      • 部门可以分散在一个国家或地区︰ 在伦敦,HR 在 Swansea 等市场营销。
      • 部门都链接到一个公司的部门
    • 链接到父公司部门
  2. 从类的角度︰
    • 会话是主表
      • 一位教师所链接的每个会话
      • Statusid 被赋予到每个会话。例如,0-完成、 1-已取消
      • 会话可分为任意大小的"包"
    • 每个包分配给客户端

我"设计"(更像都胡乱写着) 一张纸上的架构,试图使其标准化到第三的窗体。我然后插入它 MySQL 工作台和它做它全部都非常为我︰
(单击此处查看大图)

alt text

我将运行的查询示例

  • 与信用仍保留哪些客户端处于非活动状态 (那些没有计划在将来的类)
  • (在每个会话的状态 id 计) 的客户端/部门/分公司每的出席率是什么
  • 教师一个月中已有多少类
  • 标志具有低出席率的客户端
  • 他们的部门中的人员的出席率的 HR 部门的自定义报表

问题

  • 这 overengineered 或将要介绍的正确方法?
  • 需要加入大多数查询结果的多个表中较大的性能将会冲击?
  • 我已将 lastsession 列添加到客户端,因为它有可能将公共查询。这是一个不错的主意,还是应该保留严格标准化的数据库?

感谢您的时间

2010-02-23 18:18:07
问题评论:

亲爱的 CS 学生的第一年︰ 请继续使用 StackOverflow。问题很感兴趣,编写得很好和很有帮助。换句话说,您正处在前 1%的问题 askers。

除可以包含其他部门?如果真是这样的"有"表可能用于链接到包含的部门的划分。

感谢:) 的类型注释标记必须超出此项目的文档,但我并不认为我们发现这种情况。为向大家表示感谢。

什么样的工具用于绘制图形?

@Benny MySQL 工作台

回答:

某些问题的详细答案︰

1) 你相当多人第一次接近此类问题的目标上。我认为到目前为止相当大部分覆盖从其他人在这个问题上的指针。干得好!

2 和 3) 的性能命中您采取将很大程度上将取决于拥有和优化特定查询的正确索引 / 过程和更重要的是记录的数量。除非你谈超过万条记录在主表中您可能要具有足够主流设计性能的轨道上有不合理的硬件上的问题。

话虽如此,并且这与您的问题 3,与您的开始您可能真的不宜过于担心性能或超灵敏度规范化 orthodoxy 在此处。这是您要构建一个报告服务器、 不是事务基于应用程序的后端,将有许多不同的配置文件对于性能或标准化的重要性。数据库备份活动注册和计划应用程序都必须注意需要秒钟时间才能返回数据的查询。报表服务器函数具有多个公差对于复杂而冗长的查询,不仅有很大区别的策略来提高性能。

例如,基于事务的应用程序环境中的性能改进选项可能包括重构您的存储的过程和表结构到第 n 个学位,或开发较少的通常所需的数据的缓存策略。报告环境中您可以肯定这样做但是可以对性能产生更大的影响,通过引入一个安排的进程运行,存储预先配置的报告和您的用户访问您的数据库层,在每次请求都没有压力的快照数据的快照机制。

这一切是为了说明,哪些设计原则和采用的技巧可能不同给定数据库的角色您正在创建长 rant。我希望这就是很有帮助。

1.谢谢您,不过可以放心,这就是 !2 和 3。我仍然不知道索引的工作原理,这是一个我有计划要查阅。如果我们曾经有的扩展万条记录的"问题"可能有预算雇用有经验的开发人员︰ P 感谢见解不同数据库角色的存在,它是给我所有新的和非常有趣的事情知道。我将根据您的描述基本上是该项目的最终目标,到快照介绍。

选中了正确的想法。但是可以清理,并删除一些映射 (有 *) 表。

在部门表中,可以执行哪些操作是添加 CityId 和 DivisionId。

此外,我认为这样就够了...

我认为他是否他想要重新使用在不同的部门或城市间的部门定义需要的映射表。

是的我将同意...,但它听起来像一个部门仅能在一个城市/divison。如果没有,然后他所拥有的绝对正确。

我有我写了与"规范"在办公室里,不得不再次阅读该 wiki 文章但雅各 G 是正确的有 IIRC 某些部门的跨部门。ACME 医疗保健和 ACME bodycare ACME 父的一个人力资源部门。如果我可以简化它,但我当然会感谢为建议。

我会做的唯一更改是︰
1-到 NVARCHAR 更改您 VARCHAR,如果您可能会国际,您可能希望 unicode。

2-将整型 id 更改为 Guid (唯一标识符) 如果可能的话 (这可能只是我个人的喜好)。假设最终到达您有多个环境 (开发/测试/转移/生产) 的点,您可能需要将数据迁移到另一个。具有 GUID Id 会使这容易。

3-3 层为您的公司-> 除法-> 部门结构不能满足要求。现在,这可能是过度工程,但无法一般化该层次结构,以便您可以支持 n-层的深度。这将使您的查询的一些更复杂,因此,可能不必要。此外,它可以具有多个图层的任何客户端可能会很容易"stuffable"到此模型。

4-您还可以为 VARCHAR 和没有链接状态表的客户端表中的状态。我希望有点更加清晰存在,客户机状态的表示。

1-谢谢,我已经有音调符号和 UTF8,我要提出另一个问题上的出现了问题。也许这就是问题。2-我了解到一些其他的问题这里等有争议问题上的很多,我会做更多阅读的主题。3-我会咨询这对我爸爸再次,看一看"规范"我写了,是否这就是我们应考虑的内容,请参阅。下一步将注释 — 续

4-我没有进入到它为简洁起见的主要问题︰ 在客户端上的状态是他们是否是活动状态 (有剩余会话) 或处于非活动状态 (没有剩余的会话)。通过更高的清晰度,指列的更具描述性名称?例如 enrolment_status?感谢您的输入。

re #4 中加入更清晰的名称,如果只有两个状态、 非活动/活动,然后为什么不只是使其成为 bit 列?

不同意有关的 Guid,感到震惊。它们可以是可怕的性能。不要使用它们,除非需要 replciate。

您说的是一个表中的行数以百万计的 10年时,性能仅发挥作用。如果您有该类型的结构,然后可以减轻,具有连续的 guid 和创造性的索引。否则,"性能"时,红色钓鱼折扣的 Guid。

否。它看起来像设计有很好的细节。

我认为国家和公司实际上是同一个实体在设计中,进行城市和部门。我会除去的国家和城市表 (和 Cities_Has_Departments),如有必要,向公司表中添加一个 boolean 标志,IsPublicSector (或 CompanyType 列,如果有更多的选择,比只是私营部门 / 公共事业部门)。

此外,我认为在您的部门表格的用法时出现错误。它就像部门表可为各种类型的每个客户部门可以有的部门对的引用。如果是这样,则应调用 DepartmentTypes。但您的客户端 (是,我认为,与会者) 不属于类型的部门,他们属于在一家公司的实际部门实例。实际上,您将知道给定客户端所属但没有哪一个地方,人事部门 !

换句话说,客户端应链接到表 (但这是我把只是部门) 调用 Divisions_Has_Departments。如果是这样,然后您必须折叠城市为部门像上文所提及,如果要在数据库中使用标准的参照完整性。

国家表是如果我们有运行在多个国家,并有不同的人力资源部门为每个客户端。通过这种方式,我们可以创建报表的数据与该国家/地区我们正在处理的部门工作。有关部门和城市相同,我认为我们已有两个城市里有主办公室单独 HR depts.的客户端。或者至少这是理由,我会坐下来,重新思考它以查看它们是否确实有必要。没有想到的 CompanyType,我会找出是否这是一个我们需要跟踪。

答复︰ 部门表中,我原认为轨道是使用它作为实际部门,与部门名称类型。没有,我突然有了部门的类型,它似乎更符合逻辑。知道哪些部门和人的属于,有关我想过,有链接到城市和部门 (这链接到一个公司) 的部门会起作用。我的错误?折叠到部门的城市,有些部门跨越多个城市,和我认为甚至国家。我会再次着手研究。感谢您的输入。

顺便说一句,值得注意的,是否已经生成 Csv,想要将其加载到一个 mySQL 数据库加载数据本地 INFILE 您最好的朋友︰ http://dev.mysql.com/doc/refman/5.1/en/load-data.htmlMysqlimport 也是值得看一看,并且基本上是负载数据使用 infile 好包装命令行工具。

请输入您的翻译

First-time database design: am I overengineering?

确认取消