Переход от файловых систем к базам данных

Электронные картотеки и системы файлов

Чтобы понять, почему классические электронные картотеки и различные формы систем, основанных на отдельных файлах, рано или поздно становятся неудобными и вынуждают переходить к централизованной базе данных, полезно мысленно перенестись в эпоху 50–60-х годов XX века, когда появлялись первые электронно-вычислительные машины (ЭВМ).

Тогда любой расчёт или учёт данных сводился к тому, что инженеры и математики писали специальные программы, а программисты «зашивали» логику работы с информацией непосредственно внутрь этих программ. Для хранения сведений (например, списков сотрудников, сводок о заказах, научных расчётов) чаще всего заводились отдельные файлы. Если возникала потребность в дополнительном поле (скажем, увеличить длину фамилии с 20 до 25 символов), программисту приходилось:

  1. Модифицировать структуру этих файлов в коде.
  2. Придумывать программу-конвертор, которая бы преобразовала уже накопленные данные к новому формату.
  3. Изменять процедуры чтения, записи, поиска и т. д.

Такой подход со временем показал множество узких мест. Если разные отделы в одной организации создавали «свои» картотеки, неизбежно возникала избыточность данных: у одной машины или подразделения хранился некий старый файл (например, с устаревшим телефоном клиента), у другой — более новая версия. В итоге данные о контрагенте могли расползаться на несколько десятков копий, а их синхронизация превращалась в достаточно сложную и трудоемкую задачу.

Кроме того, файлы на разных машинах часто оказывались структурно несовместимы: где-то фамилия занимала 20 байт, а где-то 15; в одном отделе разработчики писали на одном языке программирования, а в другом — на другом, с совершенно иной системой записи данных. Чтобы собрать единый отчёт или агрегировать информацию «из нескольких мест», требовалось изобретать громоздкие способы синхронного чтения разных файлов, что становилось затруднительно и для программиста, и для самой машины.

Всё это можно назвать эволюционно понятным этапом — разработчики поначалу пытались “машинным” способом воспроизвести принцип бумажной картотеки: каждая запись в своей карточке, карточки лежат в ящиках, а чтобы найти информацию, нужно найти нужный «ящик». Но в условиях быстро растущих объёмов информации и числа пользователей такой подход начал явно буксовать. Именно тогда постепенно сформировалось убеждение, что для хранения больших массивов данных и многопользовательского доступа необходимо придумывать более гибкие и централизованные решения.

Даже сегодня существуют простые приложения или утилиты, которые работают с единственным файлом (или двумя-тремя) и не требуют полноценной СУБД. Однако как только растёт количество пользователей, появляется потребность в совместном редактировании, сложных отчётах и быстрой фильтрации — системы файлов перестают удовлетворять современные требования.

Что такое база данных и зачем она нужна

Когда объём данных стал слишком велик, а требования пользователей стали включать одновременный доступ, быстрый поиск и гибкую выборку, появился новый подход: база данных (БД). Согласно ГОСТ 34.321–96, под БД понимают совокупность взаимосвязанных данных, организованных по определённой схеме для совместного использования.

Однако, справедливым будет и более расширенное определение:

База данных (database) — это организованная совокупность совместно используемых логически связанных данных и их описаний (метаданных), относящаяся к определённой предметной области и предназначенная для удовлетворения информационных потребностей организации.

Обращаясь к сути, зачем нужна база данных:

  1. Снижение избыточности и предотвращение конфликтов версий. Если раньше приходилось хранить телефон клиента в десятках файлов, то теперь в централизованной БД мы ведём его только в одном месте.
  2. Совместный доступ. Разные пользователи могут не просто просматривать, но и одновременно обновлять сведения, не рискуя затереть изменения друг друга.
  3. Централизованное управление. Существует единая «точка входа» — специальная программа (СУБД), которая следит, чтобы данные оставались непротиворечивыми, и выдаёт доступ только тем, кто имеет на это право.
  4. Надёжность и безопасность. Благодаря механизмам резервного копирования и контроля транзакций (в более поздних моделях) база данных сможет восстанавливаться после сбоев и защищать сведения от несанкционированных действий.

Таким образом, появление БД стало решающим шагом, благодаря которому человечество смогло постепенно уйти от нагромождения файловых архивов и бумажных картотек к более стройной системе хранения, где есть понятия структуры, подчинённости, связей, прав доступа и многого другого.


Эволюция моделей БД

Переход к базе данных не сразу дал идеальную концепцию хранения. В книге приводятся исторические примеры: когда в 50-х и 60-х годах появились первые промышленные ЭВМ, вычислительные мощности начали расти, а вместе с ними рос и спрос на способы организации больших объёмов данных. Можно сказать, что «спусковым крючком» к массовому развитию БД послужили грандиозные технические проекты (например, космическая программа Apollo в США), где требовалось в реальном времени обрабатывать горы информации: от расчёта траектории полёта до хранения детализации заказов, выставляемых подрядчикам.

Стандартов и согласованного понимания, как именно строить базы данных, поначалу не было, поэтому появлялись разные модели БД:

  1. Иерархическая модель
    В данной модели данные представляются в виде перевёрнутого дерева: в корне (самом верхнем уровне) лежит «главный» объект, а от него отходят ветви к подчинённым объектам, у которых, в свою очередь, могут быть свои «потомки». Это было проще, чем хаотичные файлы, поскольку достаточно очевидно — один родитель, много потомков. Так было организовано, например, хранение структур «компания → отделы → сотрудники». Однако модель слишком жёстко требовала, чтобы у каждого дочернего узла был только один родитель. Если реальная жизнь требовала иначе (связи «многие ко многим»), в иерархической структуре это становилось затруднительным.

  2. Сетевая модель
    Попытка придать данным большую гибкость: вместо деревьев используется «граф»; любая запись (узел) может иметь несколько родительских элементов. Это давало более богатые возможности, однако усложняло логику администрирования и навигации по данным. Программисту всё ещё приходилось «знать», в каких именно узлах и как связаны записи, чтобы «дойти» до нужной информации.

  3. Реляционная модель
    Принципиальный прорыв произошёл в 70-х, когда Эдгар Кодд предложил описывать данные в виде таблиц (отношений), связанных между собой с помощью общих полей (ключей). Математическая база реляционной модели (теория множеств, логика) позволила формализовать многие вопросы работы с данными. Реляционные СУБД приняли во внимание опыт предыдущих подходов и свели взаимодействие к понятным операциям: добавить запись, убрать, изменить, выбрать по условию. Были разработаны первые версии языка SQL (в то время SEQUEL), позволяющие довольно просто «запрашивать» данные. Со временем реляционные СУБД, такие как IBM DB2, Oracle, MySQL и другие, заняли доминирующую позицию в мире.

  4. Объектно-ориентированная модель
    Когда в середине 80-х объектно-ориентированное программирование стало основой софта, стали появляться идеи хранить данные в виде объектов с методами, атрибутами и наследованием. Однако «чистые» объектные БД оказались слишком сложны в стандартизации. Наиболее удачные решения — это объектно-реляционные СУБД, где к реляционной основе добавлены механизмы, напоминающие объекты.

  5. Слабо структурированные и документ-ориентированные БД (NoSQL)
    С появлением больших интернет-проектов и сменой характера данных (часто меняющиеся, не всегда фиксированной структуры) стали набирать популярность документо-ориентированные и другие нереляционные БД, способные хранить информацию, к примеру, в формате JSON. Они отлично справляются со сколь угодно «разношерстными» документами, поддерживают горизонтальное масштабирование и высокую скорость вставки. Однако для традиционных корпоративных задач зачастую всё-таки используется классическая реляционная модель, поскольку она обладает более жёсткими и отработанными механизмами целостности.

Прим.: Тот факт, что реляционные базы уже несколько десятилетий занимают лидирующие позиции, не отменяет существования и развития других моделей. Потребности современного мира (социальные сети, Big Data, аналитические хранилища) расширили область применения NoSQL и гибридных СУБД. Но почти все учебные курсы и классические проекты по-прежнему опираются на реляционную парадигму.


Практическое задание

Ниже приведены два текстовых файла (Klienty.txt и Zakazy.txt) с 100 записями каждый.

Сделайте выводы и о проделанной работе в формате мини-отчета.

  1. Файл «Klienty.txt». Каждая строка содержит 8 полей, разделённых точкой с запятой (;). Формат:
ID_Клиента;ФИО;Телефон;Город;Адрес;Email;Дата_Регистрации;Статус
  • ID_Клиента: уникальный числовой идентификатор (1 до 100).
  • ФИО: фамилия, имя и отчество.
  • Телефон: в условном формате +7-9xx-xxx-xx-xx.
  • Город: выбрано несколько крупнейших городов (повторяются).
  • Адрес: абстрактная уличная запись.
  • Email: формальный почтовый ящик.
  • Дата_Регистрации: в интервале примерно от 2024-05-01 до 2024-12-30.
  • Статус: например, «Обычный», «VIP» или «Заблокирован».
1;Иванов Иван Петрович;+7-900-111-11-11;Москва;ул. Лесная, д. 5;ivanov1@mail.ru;2024-05-02;Обычный
2;Сидорова Анна Викторовна;+7-901-222-22-22;Санкт-Петербург;пр. Невский, д. 10;anna_sidorova@mail.ru;2024-06-11;VIP
3;Петров Пётр Ильич;+7-902-333-33-33;Новосибирск;ул. Дачная, д. 45;p.petrov@mail.ru;2024-07-01;Обычный
4;Васильев Никита Олегович;+7-903-444-44-44;Казань;ул. Университетская, д. 7;nikita_vas@mail.ru;2024-08-15;Обычный
5;Жукова Елена Андреевна;+7-904-555-55-55;Екатеринбург;ул. Сибирская, д. 30;e.zhukova@mail.ru;2024-08-20;Заблокирован
6;Кузнецов Сергей Игоревич;+7-905-666-66-66;Самара;ул. Гагарина, д. 19;sergey_kuz@mail.ru;2024-09-05;VIP
7;Орлова Мария Павловна;+7-906-777-77-77;Уфа;ул. Солнечная, д. 12;mar_orlova@mail.ru;2024-05-22;Обычный
8;Виноградов Олег Семёнович;+7-907-888-88-88;Омск;ул. Садовая, д. 56;oleg_vino@mail.ru;2024-06-10;Обычный
9;Фёдоров Василий Аркадьевич;+7-908-999-99-99;Москва;ул. Центральная, д. 9;vasja-f@mail.ru;2024-05-25;VIP
10;Миронова Дарья Егоровна;+7-909-101-10-10;Санкт-Петербург;пр. Ленина, д. 100;dar_mironova@mail.ru;2024-07-03;Обычный
11;Алексеева Нина Дмитриевна;+7-910-202-20-20;Новосибирск;ул. Труда, д. 15;nina.alex@mail.ru;2024-06-28;VIP
12;Борисов Леонид Викторович;+7-911-303-30-30;Казань;ул. Лесная, д. 100;leonid_bor@mail.ru;2024-05-17;Обычный
13;Титова Ольга Владимировна;+7-912-404-40-40;Екатеринбург;ул. Космонавтов, д. 12;olga_titova@mail.ru;2024-09-01;VIP
14;Соколова Ирина Андреевна;+7-913-505-50-50;Самара;ул. Комсомольская, д. 3;i.sokolova@mail.ru;2024-06-11;Обычный
15;Павлов Дмитрий Артемьевич;+7-914-606-60-60;Уфа;пр. Победы, д. 77;d_pavlov@mail.ru;2024-07-22;Обычный
16;Королёв Андрей Сергеевич;+7-915-707-70-70;Москва;ул. Парковая, д. 5;korolev_and@mail.ru;2024-08-03;VIP
17;Медведева Екатерина Павловна;+7-916-111-11-77;Санкт-Петербург;ул. Маяковского, д. 19;ekat_med@mail.ru;2024-12-01;Обычный
18;Дмитриев Михаил Леонидович;+7-917-222-22-88;Новосибирск;ул. Сельская, д. 11;m_dmitriev@mail.ru;2024-05-09;Заблокирован
19;Белова Анастасия Андреевна;+7-918-333-33-99;Екатеринбург;ул. Победы, д. 8;nastya_bel@mail.ru;2024-07-05;Обычный
20;Николаева Оксана Дмитриевна;+7-919-444-44-10;Казань;ул. Кооперативная, д. 6;oks_nik@mail.ru;2024-10-01;Обычный
21;Гордеев Павел Олегович;+7-920-555-55-11;Самара;ул. Пушкина, д. 31;gordeey_p@mail.ru;2024-05-30;VIP
22;Ермаков Игорь Геннадьевич;+7-921-111-11-12;Уфа;ул. Дмитрова, д. 67;ermak_igor@mail.ru;2024-09-09;Обычный
23;Тарасов Виктор Анатольевич;+7-922-222-22-23;Омск;пр. Вокзальный, д. 2;viktor_tara@mail.ru;2024-05-16;Обычный
24;Шестаков Артём Витальевич;+7-923-333-33-34;Москва;ул. Большая, д. 99;art_shes@mail.ru;2024-12-15;VIP
25;Кожина Светлана Сергеевна;+7-924-444-44-45;Санкт-Петербург;ул. Мира, д. 20;s.kozhina@mail.ru;2024-08-08;Обычный
26;Попов Иван Владимирович;+7-925-111-12-12;Новосибирск;ул. Уютная, д. 3;ivan_pop@mail.ru;2024-09-22;Обычный
27;Фролова Мария Дмитриевна;+7-926-222-23-23;Казань;ул. Луговая, д. 4;frolova.m@mail.ru;2024-10-03;VIP
28;Денисов Юрий Константинович;+7-927-333-34-34;Екатеринбург;ул. Северная, д. 12;denisov_y@mail.ru;2024-05-19;Обычный
29;Романова Лидия Викторовна;+7-928-444-45-45;Самара;ул. Петра, д. 10;l.romanova@mail.ru;2024-07-30;Обычный
30;Гришин Антон Евгеньевич;+7-929-555-56-56;Уфа;ул. Тополиная, д. 1;anton_gr@mail.ru;2024-05-13;Заблокирован
31;Воробьёв Алексей Максимович;+7-930-666-67-67;Омск;ул. Ленина, д. 47;alex_vor@mail.ru;2024-05-28;VIP
32;Кириллова Светлана Ивановна;+7-931-777-78-78;Москва;ул. Речная, д. 15;kir_svet@mail.ru;2024-10-14;Обычный
33;Зуев Олег Вадимович;+7-932-888-79-79;Санкт-Петербург;ул. Профсоюзная, д. 70;oleg_zu@mail.ru;2024-06-16;Обычный
34;Морозова Татьяна Андреевна;+7-933-999-80-80;Новосибирск;ул. Молодёжная, д. 22;moro_tan@mail.ru;2024-07-18;VIP
35;Дорофеев Сергей Алексеевич;+7-934-101-81-81;Казань;ул. Красная, д. 3;s.doro@mail.ru;2024-09-12;Обычный
36;Захарова Елена Витальевна;+7-935-202-82-82;Екатеринбург;ул. Уральская, д. 55;zahar.elena@mail.ru;2024-06-02;Обычный
37;Рыбаков Павел Кириллович;+7-936-303-83-83;Самара;ул. Заречная, д. 6;rybakov_p@mail.ru;2024-07-14;VIP
38;Крылова Дарья Васильевна;+7-937-404-84-84;Уфа;ул. Летняя, д. 2;dasha_kryl@mail.ru;2024-08-06;Обычный
39;Калинин Олег Георгиевич;+7-938-505-85-85;Омск;ул. Новая, д. 10;oleg_kal@mail.ru;2024-09-07;VIP
40;Максимова Оксана Петровна;+7-939-606-86-86;Москва;ул. Арбат, д. 44;oks_max@mail.ru;2024-12-28;Обычный
41;Комаров Игорь Александрович;+7-940-111-11-41;Санкт-Петербург;ул. Заречная, д. 14;komar_igor@mail.ru;2024-10-11;VIP
42;Агапова Дарья Артёмовна;+7-941-222-22-42;Новосибирск;ул. Полевая, д. 1;agapova_d@mail.ru;2024-06-25;Обычный
43;Щербаков Алексей Степанович;+7-942-333-33-43;Казань;ул. Лазарева, д. 9;al_shcherb@mail.ru;2024-07-02;Заблокирован
44;Игнатьева Ирина Николаевна;+7-943-444-44-44;Екатеринбург;ул. Средняя, д. 27;ignat_ir@mail.ru;2024-08-12;Обычный
45;Быков Николай Дмитриевич;+7-944-555-55-45;Самара;ул. Парковая, д. 18;bykov_nd@mail.ru;2024-12-02;VIP
46;Фомина Вера Андреевна;+7-945-666-66-46;Уфа;ул. Студенческая, д. 10;fomina_v@mail.ru;2024-06-09;Обычный
47;Копылов Денис Павлович;+7-946-777-77-47;Омск;ул. Вокзальная, д. 33;d.kopylov@mail.ru;2024-10-28;Обычный
48;Карпова Лилия Романовна;+7-947-888-88-48;Москва;ул. Болотная, д. 19;lilia_karp@mail.ru;2024-08-22;VIP
49;Мальцев Григорий Станиславович;+7-948-999-99-49;Санкт-Петербург;ул. Академическая, д. 1;gri_mal@mail.ru;2024-05-15;Обычный
50;Лазарева Диана Львовна;+7-949-101-10-50;Новосибирск;ул. Титова, д. 8;diana_laz@mail.ru;2024-06-26;Обычный
51;Беляев Артём Дмитриевич;+7-950-111-11-51;Казань;ул. Славная, д. 14;bel.art@mail.ru;2024-07-09;VIP
52;Сафонова Ирина Петровна;+7-951-222-22-52;Екатеринбург;ул. Радищева, д. 11;safonovai@mail.ru;2024-09-06;Обычный
53;Рогова Анастасия Владимировна;+7-952-333-33-53;Самара;ул. Торговая, д. 2;rogova_nastya@mail.ru;2024-08-01;Обычный
54;Суханов Пётр Артёмович;+7-953-444-44-54;Уфа;ул. Заводская, д. 7;psuhanov@mail.ru;2024-05-27;VIP
55;Мартынова Зоя Фёдоровна;+7-954-555-55-55;Омск;ул. Нагорная, д. 5;zoya_mart@mail.ru;2024-10-17;Заблокирован
56;Лебедев Василий Олегович;+7-955-666-66-56;Москва;ул. Полянка, д. 80;leb_oleg@mail.ru;2024-05-05;Обычный
57;Антонова Вита Кирилловна;+7-956-777-77-57;Санкт-Петербург;ул. Малая, д. 20;antonova_v@mail.ru;2024-11-02;VIP
58;Кудрявцев Павел Юрьевич;+7-957-888-88-58;Новосибирск;ул. Учительская, д. 23;p.kudryavtsev@mail.ru;2024-07-21;Обычный
59;Шилова Алиса Петровна;+7-958-999-99-59;Казань;ул. Рабочая, д. 12;alisha@mail.ru;2024-10-11;Обычный
60;Куликов Иван Сергеевич;+7-959-101-10-60;Екатеринбург;ул. Восточная, д. 99;ivan_kulikov@mail.ru;2024-12-05;Обычный
61;Гусев Олег Артёмович;+7-960-111-11-61;Самара;ул. Первомайская, д. 4;oleg_gus@mail.ru;2024-05-06;VIP
62;Кравцова Полина Дмитриевна;+7-961-222-22-62;Уфа;ул. Мирная, д. 40;polina.krav@mail.ru;2024-06-13;Обычный
63;Ефимов Данил Николаевич;+7-962-333-33-63;Омск;ул. Лесная, д. 88;dan_efimov@mail.ru;2024-07-24;Обычный
64;Суворова Алина Владимировна;+7-963-444-44-64;Москва;ул. Гоголя, д. 8;alina_su@mail.ru;2024-08-30;VIP
65;Логинов Никита Сергеевич;+7-964-555-55-65;Санкт-Петербург;ул. Коммунальная, д. 3;nik.log@mail.ru;2024-10-09;Обычный
66;Устинова Татьяна Дмитриевна;+7-965-666-66-66;Новосибирск;ул. Южная, д. 19;tustinova@mail.ru;2024-06-04;Обычный
67;Пахомова Марина Витальевна;+7-966-777-77-67;Казань;ул. Правды, д. 11;marina_pakh@mail.ru;2024-05-21;Обычный
68;Мамонтов Олег Анатольевич;+7-967-888-88-68;Екатеринбург;ул. Горная, д. 77;oleg_mam@mail.ru;2024-07-19;VIP
69;Котова Оксана Игоревна;+7-968-999-99-69;Самара;ул. Тихая, д. 51;oks_kot@mail.ru;2024-08-09;Обычный
70;Макаров Игорь Викторович;+7-969-101-10-70;Уфа;пер. Садовый, д. 2;mak_igor@mail.ru;2024-09-03;Заблокирован
71;Гришина Ольга Леонидовна;+7-970-111-11-71;Омск;ул. Кооперативная, д. 14;gri_olga@mail.ru;2024-05-12;VIP
72;Третьяков Павел Максимович;+7-971-222-22-72;Москва;ул. Суворова, д. 7;p_tret@mail.ru;2024-06-29;Обычный
73;Швецова Дарья Фёдоровна;+7-972-333-33-73;Санкт-Петербург;ул. 3-я Линия, д. 1;dasha_shv@mail.ru;2024-07-16;Обычный
74;Горшков Илья Аркадьевич;+7-973-444-44-74;Новосибирск;ул. Железнодорожная, д. 90;gorshkov_i@mail.ru;2024-09-11;VIP
75;Авдеева Марина Андреевна;+7-974-555-55-75;Казань;ул. Фестивальная, д. 99;avdeeva_m@mail.ru;2024-10-10;Обычный
76;Зотов Пётр Михайлович;+7-975-666-66-76;Екатеринбург;ул. Солнечная, д. 4;p_zotov@mail.ru;2024-08-25;Обычный
77;Карева Лариса Павловна;+7-976-777-77-77;Самара;ул. Ломоносова, д. 2;lkareva@mail.ru;2024-05-18;VIP
78;Пластов Семён Андреевич;+7-977-888-88-78;Уфа;ул. Зеленая, д. 24;plastov_s@mail.ru;2024-07-29;Обычный
79;Руднева Алена Денисовна;+7-978-999-99-79;Омск;ул. Колхозная, д. 7;alena_rud@mail.ru;2024-09-16;Обычный
80;Овчинников Евгений Глебович;+7-979-101-10-80;Москва;ул. Успенская, д. 10;evg_ovch@mail.ru;2024-12-22;VIP
81;Князева Анастасия Витальевна;+7-980-111-11-81;Санкт-Петербург;ул. Дружбы, д. 8;knyaz_a@mail.ru;2024-05-10;Обычный
82;Зубов Антон Михайлович;+7-981-222-22-82;Новосибирск;ул. Волжская, д. 3;anton_zub@mail.ru;2024-07-07;Обычный
83;Калашников Андрей Владимирович;+7-982-333-33-83;Казань;ул. Песочная, д. 16;kalash@mail.ru;2024-10-12;Обычный
84;Пугачёва Ирина Артемьевна;+7-983-444-44-84;Екатеринбург;ул. Заповедная, д. 20;irina_puga@mail.ru;2024-06-07;VIP
85;Зайцев Игорь Фёдорович;+7-984-555-55-85;Самара;ул. Литейная, д. 9;zaycev_if@mail.ru;2024-07-13;Обычный
86;Кузина Вера Валерьевна;+7-985-666-66-86;Уфа;пер. Северный, д. 11;kuzina_v@mail.ru;2024-10-02;Обычный
87;Гаврилов Роман Витальевич;+7-986-777-77-87;Омск;ул. Тихвинская, д. 30;roman_gav@mail.ru;2024-11-01;VIP
88;Златова Анастасия Васильевна;+7-987-888-88-88;Москва;ул. Ломанная, д. 4;nastya_zl@mail.ru;2024-05-26;Обычный
89;Котов Евгений Владиславович;+7-988-999-99-89;Санкт-Петербург;пр. Светлый, д. 5;kotov_ev@mail.ru;2024-08-23;Обычный
90;Кукушкин Денис Кириллович;+7-989-101-10-90;Новосибирск;ул. Большая, д. 7;d.kukush@mail.ru;2024-06-15;Заблокирован
91;Прохорова Диана Егоровна;+7-990-111-11-91;Казань;ул. Сельсоветская, д. 48;diana_proh@mail.ru;2024-10-27;Обычный
92;Громова Лилия Андреевна;+7-991-222-22-92;Екатеринбург;ул. Арматурная, д. 7;lilia_grom@mail.ru;2024-05-09;VIP
93;Семёнов Михаил Петрович;+7-992-333-33-93;Самара;ул. Казачья, д. 3;semiha@mail.ru;2024-07-28;Обычный
94;Литвинова Карина Денисовна;+7-993-444-44-94;Уфа;ул. Достоевского, д. 15;kar_lit@mail.ru;2024-09-18;Обычный
95;Сергеев Руслан Павлович;+7-994-555-55-95;Омск;ул. Садовая, д. 90;serg_rus@mail.ru;2024-06-08;Обычный
96;Акимова Вера Георгиевна;+7-995-666-66-96;Москва;ул. Технологов, д. 2;vera_akim@mail.ru;2024-12-26;VIP
97;Корнеева Дарья Владиславовна;+7-996-777-77-97;Санкт-Петербург;ул. 1-я Советская, д. 9;darya_korn@mail.ru;2024-08-11;Обычный
98;Шаляпин Глеб Петрович;+7-997-888-88-98;Новосибирск;ул. Московская, д. 11;gleb_sha@mail.ru;2024-11-30;VIP
99;Фомичёв Лев Александрович;+7-998-999-99-99;Казань;ул. Депутатская, д. 6;lev_fom@mail.ru;2024-05-29;Обычный
100;Воронова Кристина Андреевна;+7-999-101-10-00;Екатеринбург;ул. Станционная, д. 1;voronova_k@mail.ru;2024-06-20;Обычный

  1. Файл «Zakazy.txt». Каждая строка содержит 7 полей, разделённых точкой с запятой (;). Формат:
ID_Заказа;ID_Клиента;Дата;Сумма;Способ_Оплаты;Способ_Доставки;Дата_Доставки
  • ID_Заказа: уникальный номер заказа (1..100).
  • ID_Клиента: номер клиента (должен быть в диапазоне 1..100).
  • Дата: дата оформления (в 2025 году).
  • Сумма: целое число (в районе от 300 до ~25000).
  • Способ_Оплаты: «Наличные», «Карта», «Онлайн».
  • Способ_Доставки: «Курьер» или «Самовывоз».
  • Дата_Доставки: дата, на 1–7 дней позже даты оформления (или приблизительно).
1;1;2025-01-01;400;Наличные;Самовывоз;2025-01-02
2;3;2025-01-02;7500;Карта;Курьер;2025-01-05
3;6;2025-01-03;13000;Онлайн;Курьер;2025-01-06
4;2;2025-01-03;450;Наличные;Самовывоз;2025-01-05
5;5;2025-01-04;6000;Карта;Курьер;2025-01-06
6;7;2025-01-05;9500;Онлайн;Курьер;2025-01-07
7;1;2025-01-06;2300;Наличные;Самовывоз;2025-01-09
8;10;2025-01-07;7400;Карта;Самовывоз;2025-01-10
9;13;2025-01-07;12100;Карта;Курьер;2025-01-11
10;2;2025-01-08;19000;Онлайн;Курьер;2025-01-11
11;4;2025-01-08;590;Наличные;Самовывоз;2025-01-09
12;15;2025-01-08;6400;Карта;Курьер;2025-01-10
13;25;2025-01-09;300;Онлайн;Самовывоз;2025-01-09
14;19;2025-01-09;8100;Онлайн;Курьер;2025-01-12
15;21;2025-01-10;500;Наличные;Самовывоз;2025-01-13
16;6;2025-01-10;15000;Карта;Курьер;2025-01-14
17;3;2025-01-11;2300;Онлайн;Курьер;2025-01-14
18;22;2025-01-11;17900;Наличные;Самовывоз;2025-01-12
19;9;2025-01-12;9999;Карта;Курьер;2025-01-15
20;11;2025-01-12;4500;Онлайн;Самовывоз;2025-01-14
21;18;2025-01-12;19900;Карта;Курьер;2025-01-16
22;13;2025-01-13;680;Наличные;Курьер;2025-01-15
23;17;2025-01-13;5200;Онлайн;Самовывоз;2025-01-17
24;24;2025-01-14;11900;Карта;Курьер;2025-01-18
25;1;2025-01-14;3700;Наличные;Самовывоз;2025-01-15
26;16;2025-01-14;550;Онлайн;Курьер;2025-01-17
27;20;2025-01-15;20200;Карта;Курьер;2025-01-18
28;8;2025-01-15;7777;Карта;Самовывоз;2025-01-17
29;23;2025-01-15;4300;Наличные;Самовывоз;2025-01-16
30;14;2025-01-16;13000;Онлайн;Курьер;2025-01-18
31;19;2025-01-16;400;Наличные;Самовывоз;2025-01-17
32;7;2025-01-17;15600;Онлайн;Курьер;2025-01-20
33;12;2025-01-17;8600;Карта;Курьер;2025-01-19
34;25;2025-01-18;520;Онлайн;Самовывоз;2025-01-18
35;10;2025-01-18;999;Наличные;Самовывоз;2025-01-19
36;5;2025-01-19;18500;Карта;Курьер;2025-01-22
37;9;2025-01-19;2600;Онлайн;Курьер;2025-01-21
38;21;2025-01-19;6000;Карта;Самовывоз;2025-01-20
39;4;2025-01-20;15200;Наличные;Курьер;2025-01-23
40;3;2025-01-20;4555;Онлайн;Самовывоз;2025-01-22
41;40;2025-01-21;8200;Карта;Самовывоз;2025-01-22
42;16;2025-01-21;19990;Онлайн;Курьер;2025-01-25
43;26;2025-01-21;470;Наличные;Самовывоз;2025-01-22
44;30;2025-01-22;3400;Карта;Курьер;2025-01-24
45;9;2025-01-22;12050;Онлайн;Курьер;2025-01-23
46;41;2025-01-23;1000;Наличные;Самовывоз;2025-01-24
47;50;2025-01-23;9100;Карта;Курьер;2025-01-26
48;33;2025-01-24;230;Наличные;Самовывоз;2025-01-24
49;37;2025-01-24;18900;Онлайн;Курьер;2025-01-27
50;44;2025-01-24;5700;Карта;Курьер;2025-01-26
51;60;2025-01-25;2200;Наличные;Самовывоз;2025-01-27
52;47;2025-01-25;13950;Онлайн;Курьер;2025-01-29
53;11;2025-01-25;8600;Карта;Самовывоз;2025-01-28
54;54;2025-01-26;1560;Наличные;Самовывоз;2025-01-26
55;71;2025-01-26;2020;Онлайн;Курьер;2025-01-29
56;18;2025-01-26;15000;Карта;Курьер;2025-01-28
57;32;2025-01-27;3100;Карта;Курьер;2025-01-28
58;72;2025-01-27;7800;Онлайн;Самовывоз;2025-01-28
59;65;2025-01-27;22000;Карта;Курьер;2025-01-30
60;8;2025-01-28;8888;Онлайн;Курьер;2025-01-31
61;66;2025-01-28;350;Наличные;Самовывоз;2025-01-29
62;74;2025-01-28;22200;Карта;Курьер;2025-01-29
63;9;2025-01-29;777;Онлайн;Самовывоз;2025-01-29
64;80;2025-01-29;15900;Карта;Курьер;2025-01-31
65;59;2025-01-29;10500;Онлайн;Курьер;2025-02-01
66;11;2025-01-30;4900;Наличные;Самовывоз;2025-02-01
67;90;2025-01-30;8800;Карта;Курьер;2025-02-02
68;15;2025-01-30;6100;Онлайн;Курьер;2025-02-02
69;100;2025-01-31;2400;Наличные;Самовывоз;2025-02-01
70;57;2025-01-31;13200;Карта;Самовывоз;2025-02-02
71;22;2025-01-31;3000;Онлайн;Курьер;2025-02-03
72;78;2025-02-01;540;Наличные;Самовывоз;2025-02-02
73;87;2025-02-01;18950;Онлайн;Курьер;2025-02-03
74;36;2025-02-01;14999;Карта;Курьер;2025-02-04
75;45;2025-02-02;9900;Наличные;Самовывоз;2025-02-03
76;53;2025-02-02;6750;Карта;Курьер;2025-02-04
77;49;2025-02-02;2888;Онлайн;Курьер;2025-02-03
78;1;2025-02-03;3999;Наличные;Самовывоз;2025-02-05
79;70;2025-02-03;880;Онлайн;Курьер;2025-02-05
80;95;2025-02-03;5100;Карта;Самовывоз;2025-02-04
81;64;2025-02-04;20770;Онлайн;Курьер;2025-02-06
82;46;2025-02-04;3050;Наличные;Самовывоз;2025-02-05
83;77;2025-02-04;16200;Карта;Курьер;2025-02-07
84;28;2025-02-05;4555;Онлайн;Курьер;2025-02-07
85;81;2025-02-05;6900;Карта;Самовывоз;2025-02-06
86;14;2025-02-05;990;Наличные;Самовывоз;2025-02-06
87;48;2025-02-06;12900;Онлайн;Курьер;2025-02-07
88;34;2025-02-06;2320;Карта;Курьер;2025-02-08
89;27;2025-02-06;2222;Наличные;Самовывоз;2025-02-06
90;91;2025-02-07;15000;Карта;Самовывоз;2025-02-08
91;82;2025-02-07;18600;Онлайн;Курьер;2025-02-10
92;39;2025-02-07;990;Наличные;Самовывоз;2025-02-08
93;56;2025-02-08;7550;Карта;Курьер;2025-02-11
94;86;2025-02-08;4999;Онлайн;Курьер;2025-02-09
95;29;2025-02-08;12200;Наличные;Самовывоз;2025-02-09
96;61;2025-02-09;7800;Карта;Курьер;2025-02-11
97;31;2025-02-09;340;Онлайн;Курьер;2025-02-10
98;94;2025-02-09;10700;Карта;Самовывоз;2025-02-10
99;75;2025-02-10;20600;Онлайн;Курьер;2025-02-13
100;24;2025-02-10;499;Наличные;Самовывоз;2025-02-11

Список вопросов

1. Расширенный поиск и фильтрация:

  • Найти все заказы, где сумма превышает 10000, оформленные за последние 5 дней. Требуется получить даты заказов, суммы и ФИО клиентов.
  • Пользователи хотят сразу видеть не только ФИО клиента, но и город и email. Объясните, как слить данные из двух файлов.
  • Нужно выделить заказы со способом оплаты «Онлайн» или «Карта», при этом показать только тех клиентов, у кого статус = «VIP». Как можно соединить ID_Клиента и статус?

2. Подсчёты и группировка:

  • Подсчитать общее количество заказов, сделанных каждым городом (ориентируясь на поле «Город» из Klienty.txt и ID_Клиента из Zakazy.txt).
  • Определить среднюю сумму заказов по каждому статусу (Обычный, VIP, Заблокирован). Нужно одновременно «достать» статусы из первого файла и суммы из второго. Что делать, если в Klienty.txt есть ID клиента со статусом «Заблокирован», но такой клиент сделал несколько заказов до блокировки?
  • Посчитать суммарную выручку по каждой дате доставки (поле «Дата_Доставки») и сравнить её с датой оформления заказа.

3. Проверка целостности и дублирования:

  • Предположим, в файле Zakazy.txt вдруг появились ссылки на ID_Клиента=101. В Klienty.txt же всего 100 клиентов (ID 101 не существует). Что произойдёт? Как понять, какие заказы «висят в воздухе»? Где логика, которая запрещает такие ошибки?
  • Один и тот же клиент (допустим, ID=9) в «реальности» сменил фамилию, а в файле Klienty.txt старая фамилия не обновлена, зато уже создались новые заказы с «новой» фамилией (предположим, какой-то отдел внёс изменения в копию файла). Как согласовать копии? Что будет, если у разных сотрудников компании разная версия Klienty.txt?

4. Сложное условие объединения:

  • Нужно вывести список заказов, у которых «Способ_Оплаты» = «Карта», Сумма > 9000, и при этом клиенты находятся в «Москва» или «Санкт-Петербург». Нужно также показать не только их ФИО, но и даты регистрации, чтобы узнать, «насколько свежий» клиент.
  • Необходтио сравнить «даты оформления» и «даты доставки» и найти все случаи, когда доставка опоздала более чем на 3 дня. При хранении в файлах как проверить разницу дат? Каким образом можно учесть различный формат дат?

5. Многопользовательские конфликты:

  • Что, если два оператора одновременно корректируют файл Klienty.txt — один меняет e-mail у клиента ID=10, другой одновременно меняет его «Статус»? Есть ли какой-то встроенный механизм блокировки в текстовых файлах?
  • Если конфликты привели к тому, что часть строк «переписалась» или файл повредился, как восстановить информацию? Есть ли централизованное логирование изменений или транзакции?