Если элемент в базовой таблице был удалён и его индекс находится в диапазоне, соответствующем некоторому представлению, то для таблицы отображения из её правой границы берётся ближайший элемент, а значения всех последующих элементов уменьшаются на 1.
Представление класса
table *t
Таблица, соответствующая этому представлению.
vector<int> allSub
Последовательность индексов элементов представления, соответствующих элементам базовой таблицы.
void delElm(int opSub)
При заданном индексе элемента представления в базовой таблице удаляет этот элемент. Все последующие элементы представления получают значение на единицу меньше.
string ID
Имя представления.
view(string ID, table* t, vector<int> allSub)
Конструктор.
bool delDirElm(int opSub)
Вызывается после удаления элемента базовой таблицы по событию маршрутизации. Если удалённый элемент представлен в этом представлении, то он также удаляется, а все последующие элементы представления получают значение на единицу меньше.
void mod(int opSub, vector<Basic*> tuple)
Изменяет элемент представления и воздействует на базовую таблицу.
void del(int opSub)
Удаляет элемент представления и воздействует на базовую таблицу.
void del(vector<int> allOpSub)
Массово удаляет элементы представления (автоматически обрабатывает смещение индексов, возникающее при удалении) и воздействует на базовую таблицу.
col* genNewCol(vector<int> subList)
Создаёт копию столбца this с индексами, указанными в списке subList, и возвращает её.
vector<int> findCol(vector<string> colID)
Находит индексы столбцов с именами, указанными в списке colID.
table* genNewTable(vector<int> colSubList, vector<int> tupSubList)
Создаёт новую таблицу с заданными списками индексов столбцов и кортежей и возвращает её.
Разработать структуру данных для хранения таблиц в базе данных.
В реляционных базах данных таблицы имеют разные столбцы с разными характеристиками, такими как тип данных, ограничения и триггеры. Поэтому необходимо использовать отдельную структуру для представления каждого столбца. Эти структуры объединяются в таблицы.
Определяется класс столбца (col), который в конструкторе указывает тип данных и основные ограничения. Можно добавить триггеры и другие ограничения через методы класса, но они пока не поддерживаются, поскольку язык запросов к базе данных ещё не интегрирован с системой базы данных. При добавлении данных в столбец автоматически проверяется их соответствие типу данных столбца, и если типы не совпадают, генерируется исключение.
Определён класс таблицы (table), который должен поддерживать столбцы, индексы и журналы. Все столбцы передаются в конструктор таблицы в качестве параметров, после чего таблица становится владельцем всех столбцов. Затем автоматически создаются индексы для всех столбцов (по умолчанию — обходное индексирование, т. е. последовательный поиск). Пользователи могут создавать собственные индексы для определённых столбцов, заменяя существующие индексы с помощью метода замены. Функции ведения журнала связаны с методами добавления, изменения и удаления таблицы, которые автоматически создают записи журнала после выполнения операции. Подробнее см. раздел «Модуль журнала».
Для операций добавления, изменения и удаления на уровне таблицы единицей является кортеж. Внутри методов эти операции преобразуются в операции над соответствующими столбцами, и вызываются методы столбцов для фактического выполнения операций.
Кроме того, класс таблицы также поддерживает функцию запроса. Здесь запрос относится к фильтрации элементов таблицы на основе условий, что называется «запросом одной таблицы». Запросы между таблицами выполняются путём применения запросов к одной таблице к результатам другой таблицы. Мы рассмотрим эту функцию позже и обеспечим дополнительную инкапсуляцию. Условия запроса выражаются с использованием объектов логических правил из механизма правил (ruleExp), каждый из которых представляет условие для одного столбца данных. Процесс запроса требует передачи условий для всех столбцов (для столбцов без условий передаётся nullptr), затем каждый столбец последовательно использует свой индекс для запроса, и результаты объединяются.
Класс столбца
const TYPE type
Тип данных столбца.
vector<Basic*> allData
Данные столбца.
string ID
Имя столбца.
col(TYPE type, string ID)
Конструктор.
col(const col &c)
Копирующий конструктор.
const vector<Basic*>& getAllData()
Возвращает ссылку на контейнер данных (только для чтения), чтобы пользователи могли просматривать и извлекать данные самостоятельно.
TYPE getType()
Получает тип данных столбца.
void pushData(Basic* v)
Добавляет данные в столбец. Автоматически проверяет тип данных.
col* genNewCol(vector<int> subList)
Выбирает некоторые данные столбца и создаёт новый столбец (копирует данные).
bool mod(int opSub, Basic* v)
Изменяет определённый элемент столбца. Возвращает false, если v является заполнителем или совпадает с текущим элементом, в противном случае возвращает true.
void del(int opSub)
Удаляет определённый элемент столбца.
void del(vector<int> allOpSub)
Массовое удаление элементов столбца. Автоматически обрабатывает смещения индексов, возникающие при удалении.
~col()
Деструктор, освобождает пространство для всех данных.
Класс таблицы
vector<col*> allCol
Все столбцы таблицы.
vector<index*> allIndex
Индексы для каждого столбца.
list<record> allRecord
Журнал записей с момента последнего сохранения на диск.
string ID
Имя таблицы.
table(string ID, vector<col*>allCol)
Конструктор.
table(const table& t)
Копирование конструктора (не копирует индексы, повторно создаёт обходное индексирование).
void changeIndex(int sub, index* ind)
Меняет индекс определённого столбца.
const vector<col*>& getAllCol()
Возвращает контейнер столбцов (только для чтения), чтобы пользователи могли просматривать и извлекать столбцы самостоятельно.
static table* loadFile(string path)
Загружает таблицу из файла, используя десериализацию.
void saveFile(string path)
Сохраняет таблицу в файл, используя сериализацию.
void updateFile(string path)
Применяет изменения в журнале к файлу.
table* genNewTable(vector<int> subList)
Выбирает несколько столбцов таблицы и создаёт новую таблицу (копирует данные).
void add(vector<Basic*> tuple)
Добавляет кортеж в таблицу.
void mod(int opSub, vector<Basic*> tuple)
Изменяет кортеж таблицы (tuple представляет изменённый кортеж, можно использовать заполнитель). Изменение реализуется методом mod соответствующего столбца. Это приводит к явному определению того, какой столбец изменяется, а какой нет. Результат применяется к двум альтернативным стратегиям ведения журнала: если включена макрокоманда logStrategy, журнал изменений будет содержать только фактические изменённые элементы столбца, остальные элементы будут заполнителями; если она не включена, журнал изменений будет содержать весь изменённый кортеж. Обе стратегии требуют разных алгоритмов обновленияFile (добавления изменений в журнал на диске), и текущий метод updateFile поддерживает только стратегию без включения logStrategy.
void del(int opSub)
Удаляет кортеж из таблицы.
void del(vector<int> allOpSub)
Массовое удаление кортежей из таблицы. Автоматически обрабатывает смещения индексов, возникающие при удалении.
vector<int> find(vector<ruleExp> allExp)
Фильтрует элементы таблицы, соответствующие условиям, и возвращает их индексы. Условия выражаются объектами логических правил из механизма правил (ruleExp), где каждый объект представляет условие для определённого столбца данных. Для запроса требуется передать условия для всех столбцов (столбцам без условий передаётся nullptr), затем последовательно использовать индекс каждого столбца для запроса и объединить результаты.
~table()
Деструктор, освобождает пространства для всех столбцов и индексов.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )