我正在尝试为我的软件开发公司的大约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天),类似于 - >每个用户都有“MMAANNOOOAAMMNNAAOO ...”;月表将包含每个员工的此类字符串。
你会建议什么?
答案 0 :(得分:12)
我会选择三桌Kimball明星(日期,员工,日程表),因为迟早会要求您创建(要求)报告。谁工作了大多数夜晚?谁在大多数周末工作?谁不在周末工作?为什么我总是在星期五下午安排?在某一天的某一天,某些员工最有可能不会出现?等等...
表格是:
TABLE dimDate (KeyDate, FullDate, DayOfWeek, DayNumberInWeek, IsHoliday,... more here)
您可以预先填写dimDate表10年左右 - 可能需要不时调整“IsHoliday”列。
员工表也很少(相对)变化
TABLE dimEmployee (KeyEmployee, FirstName, LastName, Age, ... more here)
日程表是您填写工作时间表的地方,我还为每个班次建议了“HoursOfWork”,这样很容易在报告中汇总小时数,例如:“John Doe去年工作了几个小时在假期?“
TABLE factSchedule (
KeySchedule, -- surrogate PK
KeyDate, -- FK to dimDate table
KeyEmployee, -- FK to dimEmployee table
Shift, -- shift number (degenerate dimension)
HoursOfWork, -- number of work hours in that shift
)
您还可以将KeyDate,KeyEmployee和Shift组合成一个复合主键,以确保您不能在同一天在同一班次安排同一个人,而不是使用代理KeySchedule。如果使用了代理键,请在应用层上进行检查 查询时,请加入以下表格:
SELECT SUM(s.HoursOfWork)
FROM factSchedule AS s
JOIN dimDate AS d ON s.KeyDate = d.KeyDate
JOIN dimEmployee AS e ON s.KeyEmployee = e.KeyEmployee
WHERE
e.FirstName='John' AND e.LastName='Doe'
AND d.Year = 2009 AND d.IsHoliday ='Yes';
如果使用MySQL,可以将MyISAM用于存储引擎并将外键(FK)实现为“仅逻辑” - 使用应用程序层来处理参照完整性。
希望这会有所帮助。
答案 1 :(得分:2)
首先快速回答:
尽管如此,最好的数据库设计在很大程度上取决于您要对数据做些什么。如果 all 你需要做的就是存储记录并将它们显示在一个类似于你的例子的表中,你的方法(虽然不优雅)会起作用。
但是,如果您要检索数据或运行报告,您将需要比字符串更有条理的内容,其中每个字符代表班次分配的类型。
答案 2 :(得分:1)
我建议使用更多的noramlized数据库,例如一张人和一张桌子,这是一个perdon和日期的班次信息的产物。