mysql – 在赌场的24/7员工名单的数据库模型

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

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

基本数据
在我们考虑调度/时间之前,这里有一些基本数据可供使用.

雇员
 – 身份证号
 – 名称
  – 技能(二十一点,百家乐,轮盘等)


 – 身份证号
  – 技能/类型(只能是一项技能)

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

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

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

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

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

————————————————– ————————————–

MYSQL具体

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

另一个表可以存储游戏表,这些表将具有它们自己的ID并且引用具有外键的技能/游戏类型.

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

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

————————————————– ————————————–

Neo4j具体

有了这个数据,我会有一个Employee和一个表节点,它们有“isA”关系边缘映射到实际的员工或表吗?
我想象两种类型的技能,我最好使用技能节点并建立这样的关系?:Blackjack-> isA->技能,员工 – > hasSkill-> Blackjack,Table-> typeIs- &GT二十一点?

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

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

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

>工作人员每周都有不同的日期和开始/结束时间,这可能是属性{shiftStart,shiftEnd,actualStart,actualEnd}的班次节点,工作人员可能会迟到或在轮班期间生病.这是将每个班次与员工联系起来的正确方法吗?雇员(节点) – &GT移位(groupNode) – &GT移位(节点)
>表格和工作人员可能修改了技能数据,存档数据可能是一个问题,我认为解决方案是在与技能的关系上有时间属性?
>我们全天打开和关闭桌子,每张桌子都有每天的开放/关闭时间,这可能会在一个月内根据管理层的需要而变化,此外时间也不严格,由于各种原因经理可能会打开或关闭轮班期间的桌子.表节点的打开/关闭状态可能只与轮班期间的查询相关,这让我感到困惑,因为我想要查询但是随着时间的推移存档它可能没有意义?

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

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

————————————————– ————————————–

如果有任何很好的资源我可以了解数据库开发是否很好,那里有太多的信息和选项,很难知道从什么开始.谢谢你的时间 :)

解决方法:

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

在上面你会看到一个相当解释的图形数据模型.如果您对此不熟悉,我建议您阅读图形数据库: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上与我联系.

干杯,

肯尼

上一篇:将neo4j查询结果加载到python的`igraph`图中


下一篇:neo4j 初探