Рабочий график разработки базы данных SQL против экипажей - PullRequest
0 голосов
/ 12 февраля 2019

Первый вопрос здесь, поэтому, пожалуйста, дайте мне знать как , чтобы лучше задать вопрос, если приведенный ниже бесполезен.

TLDR - Должен ли я разделить таблицы времени сотрудников длясотрудники, назначенные в бригады, и те, кто не работает?

Я пытаюсь создать базу данных, следуя книге «Дизайн базы данных для простых смертных», которая отслеживает время сотрудников.Я пытаюсь заменить используемые еженедельные табели рабочего времени и бумажные листы (с указанием времени начала и окончания для экипажа).Существуют также еженедельные табели отдельных сотрудников для тех, кто не назначен для экипажа.Также на листах экипажа иногда есть звездочка, если кто-то болен и т. Д.

Существует связь Проектов с экипажами (1: N), и для отдельного сотрудника, не назначенного для экипажей, назначается проект.Сотрудники назначаются в экипажи, обычно 1: 1, но головная боль возникает, когда 1: N.

Отношения "Имеет"

Таким образом, на данный момент существуют разные типы экипажейскажем, A, B, C, D, E.

Экипажи D & E будут просто заполнять еженедельные табели учета времени (проект, имена и время, поэтому команды D и E будут участвовать в этом же проекте) и ежедневныелисты не включают время.Иногда примерно в 10% случаев сотрудники будут работать в D & E в один и тот же день.

A, B, C будут иметь ежедневное время на дневном листе, но если сотрудник в команде C в эти временаПревышать время на листах A или B (если они также на A или B).

Очевидный ответ: {employee, datetimestart, datetimeend} не сработает, так как мне все равно, где времяродом из (экипаж, физическое лицо, если исключение для экипажа, например, больной, физическое лицо, не назначенное для экипажа).

Я могу расширить, чтобы {сотрудник, тип экипажа, datetimestart, datetimeend} это не заботилось оСотрудник работает в D & E. Я могу поставить DE или F в этом случае?

Тогда как мне работать только с теми, кто назначен проекту?если у меня есть {сотрудник, тип экипажа, projectref, datetimestart, datetimeend}, то projectref является избыточным и может быть получен из типа команды, если оно не равно нулю.Это разумный подход или лучше было бы иметь отдельные таблицы?

РЕДАКТИРОВАТЬ - или я должен иметь одну таблицу {crewid, datetimestart, datetimeend} - выводить время для сотрудников из экипажа-отношения с сотрудником, и имеют отдельную {сотрудник, дата-время начала, дата-время-конец, категория} с категорией, в которой говорится об исключении (например, о болезни) или о неназначенном человеке?

1 Ответ

0 голосов
/ 14 февраля 2019

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

С точки зрения того, как вы храните дату, помните, что вам всегда нужно учитывать случаи исключений, поэтому что-то происходит 10% времени, или 1%, или один на тысячу все еще нужно обслуживать, иначе вы просто не сможете сохранить данные.

Я бы предпочел разработать наиболее подробный уровень, который может быть сотрудником,Команда, проект, дата, время и, возможно, также добавить столбец распределения, который по умолчанию равен 1, но может быть 0,5, если человек наполовину распределен между двумя командами одновременно.

После этого вы могли бы писать запросы, чтобы, если человек назначен для экипажа, он получал время экипажа по умолчанию, если у него нет переопределенных значений или каких-либо других необходимых вам правил.

ДействительноЭто итеративное моделирование, которое вы будете делать со своими бизнес-пользователями, когда будете дразнить дизайн.Не всегда легко в реальном сценарии.

Извините, здесь нет окончательной модели, но, возможно, несколько советов, которые могут быть полезны на этом пути.Удачи с этим.

...