打卡/打卡表的最佳设计是什么?
您是否会将打卡输入/输出存储在同一个表或单独的表中?为什么呢?
编辑 - 每小时的员工在轮班开始时就会打卡,并在轮班结束时打卡。每小时 - 除了当天开始/结束时的进/出外,豁免员工必须冲出/进入午餐。
答案 0 :(得分:10)
只需将其视为“事件”表,其中包含常用的属性,(打入或关闭),时和其中<的属性/ em>的。 ( 在这种情况下可能不适用。)
答案 1 :(得分:5)
假设你的程序有PUNCH IN和PUNCH OUT按钮,那么带有用户ID,插入和打孔字段的时钟表是一个很好的方法
您可以使用其他人建议的事件表对此进行建模,但该模型的问题是您必须有一个Type字段(in或out),或者您必须尝试确定用户是否正在打孔进出;也许把它全部放在一行 - 这样如果有人试图打出但从未打过,这是一个微不足道的查询来计算出来,你不必愚弄两个记录和每个类型 - 出对
摘要:一个包含输入/输出日期的表是更少的存储和更简单的查询
请注意,对单个时钟打孔事件进行建模不仅需要额外的(浪费的)事件类型字段,还会使处理不必要地复杂化,并且只能通过时间比较找到记录之间的1:1关系
编辑:此时我们并不知道OP是使用哑式打卡时钟设备还是智能打卡时钟程序。如果是前者,那么除了记录拳击事件和调和之后别无选择;如果是后者,则可以在发生冲击时进行对帐/检测。答案 2 :(得分:3)
去过那儿。你想要一个简单的事件表。不要将插入和打孔组合到同一记录中。不可思议的是,人们会尝试在没有打卡记录的情况下进行打卡,并且在找出原因时无法锁定系统。只记录您的内容并标记管理错误。
编辑:这可能是彼得所说的。如果是这样的话,那就投票了 - 他先来了,我已经有很多分了。
编辑:这是现存最古老,调试最彻底的范例之一。去找一个现有的(也许是机械的)时钟系统并复制它。
答案 3 :(得分:2)
用户/进/出是IMO,更好的选择。它可以通过使用以下算法轻松处理无与伦比的打孔:
冲床:
冲出:
现在计算记录的时间是微不足道的(加上Punch Out减去每个记录的Punch In),就像识别不匹配的打孔一样(查找任何一个字段为空的记录),所有这些都不需要扫描表来尝试匹配每当你检查它们时,一切都与时间相邻的记录一致。
当然,会出现Punch Out最终与错误的Punch In相关联的情况 - 但是当使用其他方法时,相同的打孔序列会产生相同的结果,除非它使用更智能的算法来匹配它们。当用户不提供严格交替的输入/输出/输入/输出...序列时,使它们正确匹配纯粹是用于进行匹配的算法,而不是用于存储打孔的数据结构。
答案 4 :(得分:2)
从评论中可以看出,有两种不同的方法:基于事件的模型,其中每个事件(无论是“in”还是“out”)是不同的记录;和一致的输入/输出模型,其中每个“in”必须在同一记录中跟随“out”。
哪一个更好取决于它将如何使用。您的打孔系统是否确切知道打入和打出之间的区别?有些(如刷卡入口系统)则没有。如果你没有,你可能会遇到基于事件的系统的麻烦,因为第一次有人忘记冲出去,他们突然工作了24小时,然后他们从那时起16个小时。糟糕。
如果他们确实知道输入和输出之间的区别,基于事件的捕获更容易,并且干扰人类行为的机会更少(许多入门卡系统,如在停车场,假设输入/输出模型,以及如果你使用一个人的徽章退出而另一个人退出,他们会感到困惑。
但是,通常情况下,您预先获得的简单性会导致算法更加复杂,以确定在异常情况下如何处理生成的打孔数据。如果你真的需要它进/出对,并且你可以在前端强制执行(比如,通过不让人们再次打击直到他们打出来),那么进/出单记录方法将使你的生活在后端,更简单。
答案 5 :(得分:1)
Table name: Sessions
Columns : ID, UserID, Timestamp_IN, Timestamp_OUT
根据您提供的信息,我喜欢这种简单的设计。确实没有足够的信息。系统会自动检测是否是IN或OUT?用户会指定吗?等。
您似乎希望存储某种会话以及会话开始和结束的时间。你可以连续两次冲出而不会冲入吗?这些问题很重要。
答案 6 :(得分:1)
我将使用UserID,Date,TimeIn,TimeOut,LunchStart和LunchEnd作为字段的表。对于非小时豁免的员工,LunchStart和LunchEnd将保留为NULL。
有些人可能会抱怨午餐领域对某些员工来说总是空的,但这是一个非常微不足道的问题。这是一个非常简单的设计,可以确保每位员工每天一条记录,并且可以非常轻松地计算每天的总工作时间。
答案 7 :(得分:1)
底线 - 这应该是一个选择/购买选择,只有一个真正的选择。它是丑陋的,凌乱的,最终面向用户,并且一遍又一遍地被解决。请不要再按照第一原则再做一次。无论如何,你将需要购买硬件,而且它们都带有软件。
至少我希望你不会重新发明硬件......
答案 8 :(得分:0)
Waves'关于打卡/打卡表的最佳设计的原始问题是由于我在工作中与他进行的简短讨论而发布的。我们在公司的IT部门一起工作,我就是那个正在替换当前纸质时间卡流程的人。所以当我告诉我他已经代表我发布了一个问题时,我以为我会把我的桨扔到这里。
目前,我们为在工厂工作的非豁免小时工提供机械打卡时钟。非豁免的每小时OFFICE员工(穿着干净衬衫的员工)用手填写时间表而不是打钟。
我的老板要我写一个系统,为工厂工人使用感应读卡器。该系统还允许工厂和办公室工作人员在PC上使用他们公司的登录ID进行打卡/打卡。
我们在建筑物的所有入口处使用感应读卡器,并且使用专有软件在SQL Server表中记录进入/退出时间。我可以访问SQL Server表,并且已经编写了一个配套的网页,在接待员的桌面上显示了输入/输出板。
入口处的读者成对出现:每个入口处的建筑物外侧有一个,每个入口内侧对应一个。因此,读者根据读者的实际位置记录员工是进入还是离开建筑物。
我应该使用其中一个“哑”读者作为时间卡更换计划的读者。因此, 不 知道打卡是“打入”还是“打出”打击。
我推测我们可以使用两个读卡器,以类似的方式使用工厂人员使用当前的进/出读卡器;也就是说,当打入时,轻扫 此 阅读器,并在击出 那个 阅读器时。但由于要求允许任何非豁免员工在PC上打卡/打卡,我对于如何处理办公室工作人员的输入/输出指定以匹配双读卡器而感到困惑。植物人。
所以这就是我到目前为止所提出的:
如果Personnel表中的In / Out键字段为空/ NULL,则必须将新记录插入In / Out表中,并使用“raw”表中的TimeStamp填充InTimeStamp。然后使用新创建的输入/输出记录中的密钥更新人员表的输入/输出键字段。
如果Personnel表中的In / Out键字段包含键值,则In / Out表中的相应记录将被定位,并使用OutTimeStamp字段中“raw”表中的最新TimeStamp进行更新。然后从人员表中删除输入/输出键字段值。
这是一个非常严重的问题,好吧。现在,在你问我们为什么不只是使用入境/出境系统的信息之前,我会告诉你,因为人力资源部的政策。在这里,我们允许人们在轮班之前进入大楼。但是,员工可能会在班次开始前超过7分钟 打卡。因此,员工已经“有条件”地在他们班次开始前7分钟一直闲逛。然后他们快速接连。
我们之所以这样做,是因为如果员工在轮班开始前8分钟内打了一拳,那么公司就要付给他额外的四分之一小时。同样地,如果一名员工在结束后8分钟就在轮班结束时出拳,那么该公司必须再支付额外的四分之一小时。
我为此长度道歉,但我觉得这里给出的优秀答案对上下文有更全面的解释是很重要的。另外,wave代表我发布了一个问题,我实际上是在“劫持”该主题。我希望他没事。
此致
史蒂夫·艾尔巴赫 美国威斯康星州NeenahP.S。,我想赞扬那些有帮助的答案的人。我可以将其作为“线程劫持者”吗?
答案 9 :(得分:0)
为此问题使用jquery easy in/out
我刚才做了一个简单的程序,为了简化起见,我保存的所有变量都来自这个简单的代码
show='*'
非常短的时钟设计易于获得变量。 http://jsfiddle.net/2pqn6a1z/6/