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