Модель базы данных для круглосуточного списка сотрудников в казино

В настоящее время мы используем реестр на основе пера / бумаги для управления персоналом настольных игр в казино. Каждая строка представляет собой сотрудника, каждый столбец представляет собой 20-минутный блок времени, и каждая ячейка представляет таблицу, которой назначен сотрудник, или, в качестве альтернативы, ему был назначен перерыв. Время начала и окончания смен для сотрудников варьируется, также как и игры / навыки, которыми они могут заниматься. Нам нужно хранить копии реестров в течение 7 лет, с бумагой это довольно просто, я хочу разработать цифровое приложение и испытываю трудности с хранением данных в базе данных для архивирования.

Я довольно плохо знаком с работой с базами данных, думаю, я понимаю, как моделировать данные для графической базы данных, такой как neo4j, но у меня возникли трудности, когда дело дошло до работы со временем. Я попытался узнать о базах данных СУБД, таких как MySQL, ниже я думаю, что данные должны моделироваться. Пожалуйста, укажите, если я иду в неправильном направлении, или если другой тип базы данных будет более подходящим, это будет с благодарностью!

Основные данные
Вот некоторые базовые данные для работы, прежде чем мы учтем планирование / время.

Работник
- Идентификационный номер
- Название
- Навыки (Блэкджек, Баккара, Рулетка и т. Д.)

Таблица
- Идентификационный номер
- Навык / Тип (может быть только один навык)

Может быть, лучше хранить данные реестра в виде файла, такого как JSON? Чувствительные ко времени данные не были бы такой большой проблемой тогда. Преимущество использования цифровых данных в базе данных - это запросы, которые могут помочь в выполнении трудоемких задач, где часто встречаются человеческие ошибки.

Возможные Запросы
Примечание. Персонал, работающий в смену, либо на перерыве, либо на полу (назначен на стол). Навыки имеют основной или второстепенный тип в зависимости от сложности обучения.

  • Какие сотрудники были на полу 80 и более минут? (Они должны на перерыв)
  • На какие открытые таблицы я могу назначить этого сотрудника в зависимости от его квалификации?
  • Мне нужен сотрудник, который имеет навык баккара, но еще не назначен в таблицу баккара.
  • Какие сотрудники были за этим столом в течение этого периода времени?
  • Где был этот сотрудник в данный момент?
  • Кто сейчас на смене?
  • Сколько сотрудников в смену может разобраться с Блэкджеком?
  • Сколько сотрудников имеют 3 основных навыка?
  • Какой персонал обладал навыком баккара не менее 3 месяцев?

Эти запросы также могут быть отсортированы по алфавиту или времени, навыку и т. Д.

Я почти уверен, что знаю, как выполнить эти запросы с помощью cypher для neo4j, при условии, что я смоделировал данные правильно. Я не так хорошо разбираюсь в SQL-запросах, я читал, что это может быть немного сложнее в зависимости от запроса и структуры.

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

MYSQL Specific

Таблица сотрудника может содержать свойства, такие как их идентификационный номер и имя, но я прав, что для их навыков и смен это будут отдельные таблицы, которые ссылаются на сотрудника по уникальному целому числу (я думаю, это называется внешним ключом?).

В другой таблице могут храниться игровые столы, они будут иметь свой собственный идентификатор и ссылаться на тип навыка / игры с помощью внешнего ключа.

Для записи данных, таких как список пера / бумаги, каждый день может иметь таблицу со столбцами, начиная с 0000, увеличиваясь на 20, и доходя до 2340? До столбцов времени у меня мог быть один столбец для персонала, где каждый сотрудник представлен своим внешним ключом, тогда столбцы времени имели бы внешние ключи для назначенных игровых таблиц, в строке данных должно быть много ячеек, которые не заполняются с тех пор. Смена персонала не будет 24/7. Если я использую внешние ключи для ссылки на игровые столы, у меня сейчас есть проблема, когда сотрудник находится на перерыве? Разве я не рассматриваю первую запись в игровом столе как перерыв?

Возможно, мне понадобится еще больше усложнить ситуацию, однако со временем руководство будет пытаться использовать различные макеты игровых столов, некоторые игровые столы можно преобразовать, скажем, в блэкджек в баккара. это должно произойти чуть более 7 лет, хотел бы я создать новые записи в игровой таблице или добавить столбец для использования внешнего ключа и ссылки на новую таблицу, в которой хранится история типов игр за периоды времени? Сотрудники также будут учиться играть в новые игры в течение своей карьеры, очень редко они могут также лишить навыка.

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

Neo4j Specific

С этими данными у меня будет узел Employee и таблица, у которых есть ребра отношения isA, сопоставленные с фактическими сотрудниками или таблицами? Я полагаю, что с навыками для этих двух типов мне лучше всего будет работать с узлом Skill и устанавливать отношения, например, так: Blackjack->isA->Skill, Employee->hasSkill->Blackjack, Table->typeIs->Blackjack?

ВРЕМЯ
Я испытываю трудности, когда хочу, чтобы эта база данных теперь работала с временной шкалой. Я столкнулся со следующими предложениями для соединения узлов со временем:

  • Unix Epoch кажется обычной рекомендацией?
  • Подключение узлов к графику год / месяц / день?
  • Хронология Lucene? (Я не знаю много об этом или о том, как с этим работать, некоторые уже упоминали об этом)

И несколько случаев с тем, как соотносятся время и данные:

  • Персонал меняет дни и время начала / окончания от недели к неделе, это может быть узел смены со свойствами {shiftStart,shiftEnd,actualStart,actualEnd}, персонал может опаздывать или болеть во время смены. Будет ли это правильным способом связать каждую смену с сотрудником? Сотрудник (узел)-> Сдвиги (groupNode)-> Сдвиг (узел)

  • В таблицах и персонале могут быть изменены данные навыков, с архивированными данными это может быть проблемой, я думаю, что решение заключается в том, чтобы иметь свойство времени по отношению к навыку?

  • Мы открываем и закрываем таблицы в течение дня, у каждой таблицы есть время открытия / закрытия для каждого дня, это может измениться через месяц в зависимости от того, что хочет руководство, кроме того, время не является строгим, по различным причинам менеджер может открывать или закрывать таблицы во время смены. Открытое / закрытое состояние узла таблицы может иметь отношение только к запросам во время смены, что меня смущает, поскольку я хотел бы этого для запросов, но для архивации со временем это может не иметь смысла?

Именно с запросами у меня возникают проблемы с решением, когда использовать узел или добавить свойство к узлу. Для Сотрудника у него есть имя и идентификационный номер, если бы я хотел найти сотрудника по его идентификационному номеру, было бы лучше иметь его в качестве собственного узла? Это было бы более прямым правом, вместо того, чтобы проверять всех сотрудников на этот уникальный идентификационный номер.

Я также недавно сталкивался с метками, и я понимаю, что они будут полезны для ввода узлов сотрудника и таблицы, а не для группировки их под узлом. Что касается смен для сотрудника, я думаю, что следует продолжать группировать его с помощью сменного узла. Если бы я должен был выполнять зашифрованные запросы для сотрудников, работающих в смены в течение периода времени, метка могла бы быть подходящей, однако она должна применяться к отдельным узлам смены или смещает групповой узел, который ссылается обратно на сотрудника? Мне может понадобиться добавить свойство для отдельных узлов смен или отношение к узлу группы смен? Я не уверен, должен ли быть узел группы смен, я предполагаю, что уменьшение ребер, соединяющихся с узлом сотрудника, было бы оптимальным для запросов.

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

Если есть какие-то замечательные ресурсы, которые я могу узнать о разработке баз данных, это было бы здорово, там так много информации и возможностей, что трудно понять, с чего начать. Спасибо за ваше время:)

1 ответ

Решение

Спасибо, что потратили время на то, чтобы поставить вопрос качества. Ваши требования велики, а спецификации вашей системы очень подробны. Я смог перевести ваши спецификации в графическую модель данных для Neo4j. Увидеть ниже.

Модель данных графиков сотрудников казино

Выше вы увидите довольно пояснительный график модели данных. В случае, если вы не знакомы с этим, я предлагаю прочитать Graph Databases: http://graphdatabases.com/ - На этом веб-сайте вы можете получить бесплатную цифровую копию книги в формате PDF, но если вы хотите купить печатную копию, вы можете найти это на амазоне.

Давайте разберем модель графа на изображении. Вверху вы увидите структуру индексации времени (Год)->(Месяц)->(День)->(Час), которую я сократил как Y M D 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

Приведенный выше запрос находит подграф для всех сотрудников, имеющих навык Блэкджек, а также их таблицу и местоположение на определенную дату (17.01.14).

Сделать это в SQL было бы очень сложно. Следующее, о чем вам нужно подумать, это импортировать ваши данные в базу данных Neo4j. Если вам интересно, как это сделать, пожалуйста, посмотрите на другие вопросы здесь, на SO, и если вам нужна дополнительная помощь, не стесняйтесь, чтобы опубликовать еще один вопрос или обратиться ко мне в Twitter @kennybastani.

Ура,

Kenny

Другие вопросы по тегам