Задний план
Я студент первого курса CS, и я работаю неполный рабочий день для малого бизнеса моего отца. У меня нет никакого опыта в разработке приложений реального мира. Я написал сценарии на Python, некоторые курсовые работы на C, но ничего подобного.
У моего отца небольшой учебный бизнес, и в настоящее время все занятия планируются, записываются и отслеживаются с помощью внешнего веб-приложения. Существует функция экспорта / «отчетов», но она очень общая, и нам нужны конкретные отчеты. У нас нет доступа к фактической базе данных для выполнения запросов. Меня попросили настроить систему отчетности.
Моя идея состоит в том, чтобы создать общий экспорт CSV и импортировать их (возможно, с помощью Python) в базу данных MySQL, размещаемую в офисе каждую ночь, откуда я могу выполнять конкретные запросы, которые необходимы. У меня нет опыта работы с базами данных, но я понимаю основы. Я прочитал немного о создании базы данных и нормальных формах.
Мы можем начать иметь международных клиентов в ближайшее время, поэтому я хочу, чтобы база данных не взорвалась, если / когда это произойдет. У нас также есть несколько крупных корпораций в качестве клиентов с различными подразделениями (например, материнская компания ACME, отдел здравоохранения ACME, отдел ухода за телом ACME)
Схема, которую я придумал, следующая:
- С точки зрения клиента:
- Клиенты это основной стол
- Клиенты связаны с отделом, в котором они работают
- Отделы могут быть разбросаны по всей стране: HR в Лондоне, маркетинг в Суонси и т. Д.
- Отделы связаны с подразделением компании
- Подразделения связаны с материнской компанией
- С точки зрения классов:
- Сессии является основной таблицей
- Учитель связан с каждой сессией
- Статус предоставляется каждому сеансу. Например, 0 - Завершено, 1 - Отменено
- Сессии сгруппированы в «пачки» произвольного размера
- Каждый пакет назначается клиенту
- Сессии является основной таблицей
Я «спроектировал» (точнее, набросал) схему на листе бумаги, стараясь, чтобы она нормализовалась до 3-го класса. Затем я подключил его к MySQL Workbench, и это сделало все это красивым для меня:
( Нажмите здесь для полноразмерной графики )
(источник: maian.org )
Примеры запросов, которые я буду выполнять
- Какие клиенты с кредитом все еще остались неактивными (те, у кого не запланировано обучение в будущем)
- Какова посещаемость на клиента / отдел / подразделение (измеряется идентификатором статуса в каждой сессии)
- Сколько занятий у учителя за месяц
- Пометить клиентов с низкой посещаемостью
- Пользовательские отчеты для отделов кадров с показателями посещаемости людей в их отделе
Вопросы)
- Это слишком силен или я направляюсь в правильном направлении?
- Приведет ли необходимость объединять несколько таблиц для большинства запросов к значительному снижению производительности?
- Я добавил колонку «lastsession» для клиентов, поскольку это, вероятно, будет общий запрос. Это хорошая идея, или я должен держать базу данных строго нормализованной?
Спасибо за ваше время
divisions
имеет столбец с именем divisionid
. Разве вы не находите это излишним? Просто назови это id
. также имена ваших таблиц, в том числе _has_
: я бы удалил это и просто назвал его, например cities_departments
. Ваши DATETIME
столбцы должны иметь тип, TIMESTAMP
если они не являются пользовательскими значениями. Я думаю , что это хорошая идея , чтобы иметь cities
и countries
таблицу. Вы можете столкнуться с проблемами, ограничивающими таблицы одним status
. рассмотрите возможность использования INT
и выполнения побитовых сравнений, чтобы вы могли иметь больше смысла