Как реализовать БД с uinion структур на C++

Есть задание

Реализовать программу, работающую с базой данных (БД). База данных состоит из массива структур с вариантами (внутри структуры должен быть union, объединяющий как минимум 2 других структуры). Программа должна позволять ввести новую запись в БД, удалить запись из БД и вывести необходимую запись из БД. Предметную область базы данных придумать самостоятельно.

Всё, вроде понятно с простым массивом структур, но использование union мне непонятно. Как и зачем его тут использовать?

Ниже привожу заголовочный файл, где описаны структуры и прототипы функций:


#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>

using namespace std;
/*
Структура данных
1. ФИО
2. Курс
3. Группа
4. Год зачисления
5. Вся информация
*/

struct Initial {
    string surname, name, patronymic;
};

struct Course {
    int course;
};

struct Group {
    int mainGroup, subGroup
};


struct Date {
    int day, month, year;
};

struct Data {
    Initial _initial;
    Course _course;
    Group _group;
    Date _date;
};


void DataEntry(Data* (&d), int &n)); //ввод данных вручную
void ReadingData(Data* (&d), int n, string fileName) //чтение из файла
void Print(Data* d, int n);
void DataChange(Data* (%d), int n);
void DeleteData(Data* (%d), int n);
void Copy(Data* (&d_n), Data* (&d_o), int n);
void Copy(Data& d_n, Data& d_o);
void AddDate(Data* (&d), int &n);
void DataSorting(Data* d, int n);
void SavingData(Data* d, int n, string fileName);

Ответы (1 шт):

Автор решения: DmitryK

Ну исключительно для примера (на основе вашего) - у вас есть база данных Университет, в которой хранятся записи о всех людях, которые есть. А там есть сотрудники (преподаватели, административный персонал) и есть студенты. А хранится всё в одной базе. У них у всех есть общие поля - ФИО, а есть различающиеся. Вот чтобы различающиеся поля не занимали отдельное место (хранить их на одном и том же физическом месте) и нужен union.
Для примера:

enum class PersonType { Teacher, Student }; // идентификатор, что хранится в union

struct StudentData
{
    int course;         // курс 
    int mainGroup, subGroup // группа
    int day, month, year;   // дата чего-то
    double average;       // средний балл
};

struct TeacherData 
{
    int degree;         // звание/должность по справочнику
    unsigned char[8];   // номера курсов, где читаются лекции
    int special[2];     // номера специализаций
    double coeff;       // повышающие коэффициенты 
    int unsigned char[4]; // коды наград
};

struct UnitData 
{
    int id;
    string surname,     // ФИО 
           name, 
           patronymic;
    std::chrono::year_month_day birthday;     // дата рождения
    PersonType type;    // тип данных, хранимых в union
    union 
    {
        TeacherData teacher;
        StudentData student;
    };
};

В данном случае, данные студента и преподавателя не добавляются друг к другу, а хранятся на одном и том же физическом месте, не увеличивая размер объекта UnitData.
Размеры структур могут не совпадать, тогда размер объекта UnitData будет использовать размер наибольшего из объектов, участвующих в union.

→ Ссылка