在赌场的24/7员工名册的数据库模型

时间:2014-01-16 11:18:51

标签: mysql sql database neo4j rostering

我们目前使用基于笔/纸的名册来管理赌场的桌面游戏工作人员。每行都是一名员工,每列是20分钟的时间段,每个单元格代表员工分配到的表格,或者他们已被分配到休息时间。员工轮班的开始和结束时间与他们可以处理的游戏/技能不同。我们需要保留7年的名册副本,纸张相当容易,我想开发一个数字应用程序,并且很难将数据存储在数据库中进行存档。

我对使用数据库相当陌生,我想我理解如何为像neo4j这样的图形数据库建模数据,但是在处理时间时遇到了困难。我试图了解像MySQL这样的RDBMS数据库,下面是我认为数据应该建模的方式。请指出如果我走向错误的方向或者更合适的数据库类型,我们将不胜感激!

基本数据
在我们考虑调度/时间之前,这里有一些基本数据。

员工
  - 身份证号码   - 姓名
  - 技能(二十一点,百家乐,轮盘等)


  - 身份证号码   - 技能/类型(只能是一种技能)

将名册数据存储为像JSON这样的文件可能更好吗?时间敏感的数据不会成为一个问题。使用数据库进行数字化的好处是查询,这些可以帮助协助人为错误很常见的耗时任务。

可能的查询
注意:轮班的工作人员要么在休息时间要么在场上(分配到桌子上),技能根据学习难度而有主要或次要类型。

  • 80分钟以上的工作人员在场? (他们应该休息一下)
  • 根据他们的技能,我可以为这名员工分配哪些开放表?
  • 我需要一名具有百家乐技能但尚未被分配到百家乐桌的员工。
  • 在这段时间里,这张桌子上有哪些员工?
  • 此时此员工在哪里?
  • 谁现在正在轮班?
  • 轮班的工作人员可以处理二十一点?
  • 有多少员工有3项主要技能?
  • 哪些员工至少有3个月的百家乐技能?

这些查询也可以按字母顺序或时间,技能等进行排序。

我非常确定我知道如何使用cypher为neo4j执行这些查询,前提是我正确建模数据。我不熟悉SQL查询,我读过它可能会有点复杂,具体取决于查询和结构。

-------------------------------------------- --------------------------------------------

MYSQL特定

员工表可能包含其ID号和名称等属性,但我是否正确,因为他们的技能和班次,这些将是通过唯一整数引用员工的单独表(我认为这称为外键? )。

另一张桌子可以存放游戏桌子,这些桌子会有自己的ID,并且可以用外键引用技能/游戏类型。

要记录笔/纸名册等数据,每天都可以有一个表格,其中列从0000开始增加20,一直到2340?在时间列之前,我可以为员工提供一个用其外键表示的员工,然后时间列将具有指定游戏表的外键,行数据必然会有许多单元格不是由于员工转变不会24/7,因此人口众多。如果我使用外键来引用游戏桌,那么当员工休息时,我现在遇到了问题?除非我对待说第一个游戏桌参赛作为休息?

我可能需要进一步复杂化,管理层会随着时间的推移尝试不同的游戏桌面布局,一些游戏桌可以从Blackjack转换为Baccarat。这肯定会在7年多的时间内发生,我是想创建新的游戏表条目还是添加一列来使用外键并参考一个新的表来存储游戏类型的历史记录?员工也将学习在他们的职业生涯中开展新游戏,很少他们也可以将技能移除。

-------------------------------------------- --------------------------------------------

Neo4j具体

有了这些数据,我会有一个Employee和一个表节点,其中包含" isA"关系边缘映射到实际员工或表? 我想象两种类型的技能,我最好使用技能节点并建立这样的关系?:Blackjack-> isA->技能,员工 - > hasSkill-> Blackjack,Table-> typeIs- >二十一点

TIME
当我希望这个数据库现在可以使用时间轴时,我觉得很困难。我已经提出了以下有关时间连接节点的建议:

  • Unix Epoch似乎是一个常见的推荐?
  • 将节点连接到年/月/日图表?
  • Lucene时间表? (我不太了解这个或如何使用它,已经看到一些提及它)

关于时间和数据如何相关的一些案例:

  • 工作人员每周都有不同的天数和开始/结束时间,这可能是属性{shiftStart,shiftEnd,actualStart,actualEnd}的班次节点,工作人员可能会迟到或在轮班期间生病。这是将每个班次与员工联系起来的正确方法吗?员工(节点) - >班次(groupNode) - >班次(节点)

  • 表格和工作人员可能修改了技能数据,存档数据可能是一个问题,我认为解决方案是在与技能的关系上有时间属性?

  • 我们全天打开和关闭表格,每个表格每天都有开放/关闭时间,这可能会在一个月内根据管理层的需要而变化,此外时间也不严格,原因各种各样经理可以在轮班期间打开或关闭桌子。表节点的打开/关闭状态可能仅与班次期间的查询相关,这使我感到困惑,因为我希望将此用于查询,但随着时间的推移存档可能没有意义吗?

我的查询无法决定何时使用节点或向节点添加属性。对于一个员工,他们有一个姓名和身份证号码,如果我想通过他们的身份证号码找到一个员工,那么将它作为自己的一个节点会更好吗?它会更直接,而不是通过所有员工获取该唯一ID号。

我最近也遇到过标签,我可以理解这些对于键入员工和表节点非常有用,而不是将它们分组到节点下。随着员工的轮班,我认为应该继续与轮班节点分组,如果我要为在一段时间内轮班工作的员工进行密码查询,则标签可能是适当的,但是应该将其应用于各个班次节点或者转移链接回员工的组节点?我可能需要为各个移位节点或与移位组节点的关系添加属性?我不确定是否应该有一个轮班组节点,我假设减少连接到员工节点的边缘对于查询来说是最佳的。

-------------------------------------------- --------------------------------------------

如果有任何优秀的资源我可以了解数据库开发是否很棒,那么有很多信息和选项,很难知道该如何开始。谢谢你的时间:))

1 个答案:

答案 0 :(得分:6)

感谢您花时间将质量问题放在一起。您的要求很高,您的系统规格非常详细。我能够将您的规范转换为Neo4j的图形数据模型。见下文。

Casino Employee Graph Data Model

上面你会看到一个相当解释的图形数据模型。如果你不熟悉这个,我建议阅读图形数据库:http://graphdatabases.com/ - 这个网站你可以得到这本书的免费数字PDF副本,但如果你想购买硬拷贝,你可以在亚马逊上找到它

让我们分解图像中的图形模型。在顶部,您将看到时间索引结构,即(年) - >(月) - >(日) - >(小时),我缩写为YMD H.省略号表示图表是继续,但为了屏幕上的空间,我只显示了一个子图。

此时间索引为您提供了一种生成时间序列的方法,或者在您的数据模型上询问特定时间的某些问题。非常有用。

图片的底部包含您赌场的企业数据模型。节点代表您的业务对象:

  • 游戏
  • 员工
  • 技能

图形数据库的优点在于,您可以通过它们的关系从一个节点跳到另一个节点来查看此图像并在语义上理解您的问题的语言。

以下是您可以用来询问有关数据模型的问题的Cypher查询。您可以稍微调整一下以匹配您的问题。

MATCH (employee:Employee)-[:HAS_SKILL]->(skill:Skill),
      (employee)<-[:DEALS]-(game:Game)-[:LOCATION]->(table:Table),
      (game)-[:BEGINS]->(hour:H)<-[*]-(day:D)<-[*]-(month:M)<-[*]-(year:Y)
WHERE skill.type = "Blackjack" AND 
      day.day = 17 AND 
      month.month = 1 AND 
      year.year = 2014
RETURN employee, skill, game, table

以上查询查找具有Blackjack技能的所有员工的子图表及其在特定日期(1/17/14)的表和位置。

在SQL中执行此操作将非常困难。您需要考虑的下一件事是将数据导入Neo4j数据库。如果您对如何做到这一点感到好奇,请在此处查看其他问题,如果您需要更多帮助,请随时发布另一个问题或在Twitter @kennybastani上与我联系。

干杯,

肯尼