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