我们目前使用基于笔/纸的名册来管理赌场的桌面游戏工作人员。每行代表一名员工,每列代表 20 分钟的时间段,每个单元格代表员工被分配到的表,或者他们被分配到休息时间。员工轮班的开始和结束时间各不相同,他们可以处理的游戏/技能也各不相同。我们需要将名册副本保留 7 年,使用纸张这相当容易,我想开发一个数字应用程序,但在如何将数据存储在数据库中进行存档方面遇到困难。
我对使用数据库相当陌生,我想我了解如何为像 Neo4j 这样的图形数据库建模数据,但在处理时间方面我遇到了困难。我尝试了解 MySQL 等 RDBMS 数据库,下面是我认为应该如何建模数据。请指出我是否走错了方向或者不同的数据库类型更合适,我们将不胜感激!
基本数据
在我们考虑日程安排/时间之前,这里有一些需要使用的基本数据。
Employee
- 身份证号
- Name
- 技能(二十一点、百家乐、轮盘赌等)
Table
- 身份证号
- 技能/类型(只能是一种技能)
将名册数据存储为 JSON 之类的文件可能会更好?那么时间敏感的数据就不是什么大问题了。使用数据库进行数字化的好处是查询,这些可以帮助协助完成人为错误常见的耗时任务。
可能的查询
注意:轮班的员工要么在休息,要么在地板上(分配到一张桌子上),技能根据学习难度分为主要或次要类型。
- 哪些员工在现场工作了 80 分钟或更长时间? (他们该休息了)
- 我可以根据该员工的技能将他们分配到哪些开放表?
- 我需要一名具有百家乐技能但尚未分配到百家乐牌桌的员工。
- 这段时间内这张桌子上有哪些员工?
- 该员工此时在哪里?
- 现在谁在值班?
- 有多少值班人员可以玩二十一点?
- 有多少员工拥有3项主要技能?
- 哪些员工拥有百家乐技能至少 3 个月?
这些查询也可以按字母顺序或时间、技能等排序。
我很确定我知道如何使用 Neo4j 的 cypher 执行这些查询,前提是我对数据进行了正确的建模。我对 SQL 查询不太了解,我读过它可能会变得有点复杂,具体取决于查询和结构。
-------------------------------------------------- --------------------------------------
MYSQL 特定
员工表可以包含诸如 ID 号和姓名之类的属性,但我是否正确,对于他们的技能和轮班,这些将是通过唯一整数引用员工的单独表(我认为这称为外键?)。
另一个表可以存储游戏表,这些表有自己的 ID 并使用外键引用技能/游戏类型。
为了记录像笔/纸花名册这样的数据,每天可以有一个表格,其中的列从 0000 开始增加 20 的值一直到 2340?在时间列之前,我可以为员工设置一个,其中每个员工都用他们的外键表示,然后时间列将具有分配的游戏表的外键,行数据必然有许多未填充的单元格,因为员工轮班不会是 24/7。如果我使用外键来引用游戏桌,那么当员工休息时我会遇到问题吗?除非我将第一个游戏桌条目视为休息?
不过,我可能需要使事情进一步复杂化,随着时间的推移,管理层将尝试不同的游戏桌布局,一些游戏桌可以从二十一点转换为百家乐。这种情况在 7 年内肯定会发生很多次,我是否想要创建新的游戏表条目或添加一列以使用外键并引用存储一段时间内游戏类型历史记录的新表?员工在职业生涯中还将学习如何处理新游戏,但很少有人会失去这项技能。
-------------------------------------------------- --------------------------------------
Neo4j 特定
有了这些数据,我是否会有一个 Employee 和一个 Table 节点,它们具有映射到实际员工或表的“isA”关系边?
我想对于这两种类型的技能,我最好使用技能节点并建立这样的关系?:Blackjack->isA->Skill,Employee->hasSkill->Blackjack,Table->typeIs->Blackjack?
TIME
当我希望这个数据库现在使用时间线时,我发现很困难。我遇到了以下将节点与时间连接起来的建议:
- Unix Epoch 似乎是一个常见的推荐?
- 将节点连接到年/月/日图?
- 卢森时间表? (我对此不太了解或如何使用它,见过一些人提到它)
以及时间和数据如何关联的一些案例:
员工的工作日和开始/结束时间每周都有所不同,这可能是具有属性 {shiftStart,shiftEnd,actualStart,actualEnd} 的轮班节点,员工可能会迟到或在轮班期间生病。这是将每个班次与员工联系起来的正确方法吗?员工(节点)->班次(组节点)->班次(节点)
表和人员可能已修改技能数据,对于存档数据这可能是一个问题,我认为解决方案是在与技能的关系上具有时间属性?
我们全天打开和关闭桌子,每个桌子每天都有打开/关闭时间,这可能会根据管理层的要求在一个月内发生变化,此外时间并不严格,出于各种原因经理可能会打开或关闭桌子轮班期间。表节点的打开/关闭状态可能只与轮班期间的查询相关,这让我很困惑,因为我希望它用于查询,但对于随着时间的归档可能没有意义?
通过查询,我很难决定何时使用节点或向节点添加属性。对于员工来说,他们有姓名和身份证号码,如果我想通过身份证号码找到员工,将其作为自己的节点会更好吗?这会更直接,而不是通过所有员工来查找唯一的 ID 号。
我最近也遇到过标签,我可以理解这些标签对于输入员工和表节点而不是将它们分组在节点下很有用。对于员工的轮班,我认为应该继续与轮班节点分组,如果我要对在某个时间段内轮班的员工进行密码查询,则标签可能是合适的,但是它应该应用于单个轮班节点还是切换链接回员工的组节点?我可能需要向各个轮班节点或与轮班组节点的关系添加属性?我不确定是否应该有一个轮班组节点,我假设减少连接到员工节点的边对于查询来说是最佳的。
-------------------------------------------------- --------------------------------------
如果有任何关于数据库开发的好资源,那就太好了,那里有太多的信息和选项,很难知道从哪里开始。谢谢你的时间 :)