Database design 安排员工-使用什么数据结构? 问题

Database design 安排员工-使用什么数据结构? 问题,database-design,data-structures,scheduling,Database Design,Data Structures,Scheduling,我正试图为我的软件开发公司大约10-20人编写一个简单的员工日程安排软件。经过一些考虑,我决定用Python、Ruby或PHP+Postgres/MySQL DB编写一个web应用程序。在设计数据库模型时,我开始想知道什么样的数据结构实际上最适合这种应用程序 它会是什么样子 显示月视图的应用程序示例与此类似: OCTOBER 1 2 3 4 5 6 7 8 9 ... John Apple M M A A N N O O O ... Daisy Pear O O O M M A A

我正试图为我的软件开发公司大约10-20人编写一个简单的员工日程安排软件。经过一些考虑,我决定用Python、Ruby或PHP+Postgres/MySQL DB编写一个web应用程序。在设计数据库模型时,我开始想知道什么样的数据结构实际上最适合这种应用程序

它会是什么样子 显示月视图的应用程序示例与此类似:

 OCTOBER    1 2 3 4 5 6 7 8 9 ...
John Apple  M M A A N N O O O ...
Daisy Pear  O O O M M A A N N ...
Steve Cat   A A N N O O O M M ...
Maria Dog   N N O O O M M A A ...
其中M->用于早班;A->下午班等。字母可以更改为代码

什么样的数据结构或数据库设计最适合这种情况? 我在考虑存储最多31个字符的字符串->1个字符,1天类似->mmaannooaammannaao。。。对于每个用户;Month表将包含每个员工的此类字符串

您有什么建议?

首先快速回答:

员工编号 日期 移位类型 也就是说,最好的数据库设计很大程度上取决于您将如何处理数据。如果您所需要做的只是存储记录并将它们显示在一个类似于您的示例的表中,那么您的方法虽然不优雅,但仍然有效


但是,如果要检索数据或运行报告,则需要比字符串更结构化的内容,其中每个字符表示移位分配的类型。

我建议使用更规范的数据库,例如,一张用于人员的表格,一张是perdon和日期的班次信息的乘积。

我会选择三张表格Kimball star date、Employee、Schedule,因为迟早你会被要求根据这张表格创建要求很高的报告。谁晚上工作最多?谁周末工作最多?谁周末从不工作?为什么我总是安排在周五下午?某些员工最有可能不在一周中的哪一天出现?等等,等等

表格将是:

表dimDate 关键日期 ,完整日期 ,星期一 ,DayNumberInWeek ,IsHoliday ,... 更多 您可以预填充dimDate表格10年左右,可能需要不时调整IsHoliday列

Employee表的更改也相对较少

表二雇员 关键员工 ,姓 ,姓 年龄 , ... 更多 时间表表是您填写工作时间表的地方,我还建议每个班次的工作小时数,这样可以很容易地在报告中汇总小时数,例如:John Doe去年在节假日工作了多少小时

桌子 事实一览表 密钥调度程序-代理PK ,KeyDate-FK到dimDate表 ,KeyEmployee-FK到Dimeployee表 ,Shift-移位数退化维数 ,HoursOfWork-该班次的工作小时数 您还可以将KeyDate、KeyEmployee和Shift组合成一个复合主键,以确保不能在同一天的同一班次安排同一个人,而不用代理KeySchedule。如果使用了代理密钥,请在应用程序层上检查此项。 查询时,连接表,如:

选择SUMs.HoursOfWork 从FACTS附表 在s.KeyDate=d.KeyDate上将dimDate作为d连接 在s.KeyEmployee=e.KeyEmployee上以e的身份加入Dimeployee e.FirstName='John' 和e.LastName='Doe' d.年份=2009年 和d.IsHoliday='Yes'; 如果使用MySQL,那么可以将MyISAM用于存储引擎,并将外键FK实现为仅逻辑-使用应用程序层来处理引用完整性

希望这有帮助


我考虑过做一个正常的数据库设计,这一点我马上就想到了,但对于那些应该如此简单的东西来说,这难道不是一种过分的设计吗?我可能想做一两份报告,但没那么多。@Muzzyn1-使用您的设计,您需要付出多少努力才能确定上周二下午谁在工作?或者下周五早上谁会被安排?这个数据库应该是如此简单的正常化,它绝对不是“滥杀滥伤”。对不起,我不完全是一个数据库专家。低级编程与我更为接近也许这就是为什么我尝试使用低级软件设计的概念。这个项目主要是教我自己一些web应用程序编程,让我和其他人的生活更轻松,当涉及到转换时:除了呈现的规范化数据库设计之外,还有什么可以考虑的吗?一个很好的直觉检查是为已知场景编写一些示例查询。柯克的例子是一个很好的起点。如果它只是一个小的一次性项目,并且您可以轻松地针对您的数据模型编写查询,那么就使用它。规范化方法的缺点是,调出一行数据库来获取一个人日程安排的快照可能不那么容易。如果您想通过操纵原始数据手动编辑一个人的日程安排,您的方法可能会更简单。不过,如果你想处理个人作业,标准化方法可能更好。谢谢,tryi
非常感谢你的建议,我根据你的设计开始用django编写webapp。这很有帮助。再次非常感谢: