Qt Организация взаимодействия иерархической модели и БД — sql qt sqlite

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд
Загрузка...

Вопрос:


Есть данные, хранящиеся в БД (сейчас SQLite). Прошу помочь правильно, в соответствии с канонами, MVC, организовать работу с ними в Qt-приложении.
Данные в задаче имеют иерархическую структуру.

Например, поезда метро: есть несколько поездов, в каждом несколько вагонов, в каждом из них — несколько пассажиров.

Данные каждого уровня хранятся в своей таблице в БД и ссылаются вторичными ключами на записи в вышестоящих таблицах.
Например, таблицы poezda, vagony и lyudi. Каждая запись из таблицы lyudi связана с одной из записей в таблице vagony, а та, в свою очередь, ссылается на запись в таблице poezda. Всё стандартно, без изысков.

Сейчас сделана модель данных (унаследована от QAbstractItemModel), через которую реализована работа с БД.
Модель создана на основе примеров для данных древовидной структуры. Примеры брались из разных источников.
Модель хранит данные в памяти в виде связанного набора стандартных узлов (тип данных поезд/вагон/человек записан в поле Type узла, а сами данные, собранные в структуру, хранятся в QVariant поле Data).
При старте модель считывает все данные из БД и формирует полное дерево узлов (база данных небольшая).
Чтение, правка, удаление и добавление элементов происходят через методы data, setData, removeRows и insertRows, предусмотренные QAbstractItemModel.
При этом сначала определяется тип узла, потом производятся действия с SQL таблицей, соответствующей этому типу и уже потом, при необходимости, перестраивается дерево узлов в памяти.
Тип узла определяется по типу Родительского узла (индекс Родительского узла передаётся при вызове методов, а его тип считывается вызовом data со специальной ролью).

Если Родительский узел типа вагон, значит элемент, над которым производится действие — пассажир, а значит надо работать с SQL-таблицей lyudi.
Такая организация, по всей видимости, принципиально неправильная. Сейчас она работает, но, во-первых, всё очень неудобно, во-вторых, изменения в БД в обход модели приводят к рассогласованию (обычная проблема), а в-третьих, небольшие изменения в предметной области приводят к неразрешимым проблемам.

Допустим, что на одном уровне могут находиться элементы разного типа, из разных SQL-таблиц. Например, пассажирами метро могут быть не только люди, но и собаки (таблица zhivotnye), кошки и марсиане (таблица inoplanetyane), блохи, депутаты (чисто теоретически) и глисты (таблица parazity). В этом случае, даже зная тип Родительского элемента, непонятно как определить нужную SQL-таблицу.

Пожалуйста, наведите на мысль, как правильно организовать модель и работу с БД в данном случае. Заранее всем благодарен

Автор вопроса: jasha

bronstein87

Допустим, что на одном уровне могут находиться элементы разного типа,
из разных SQL-таблиц. Например, пассажирами метро могут быть не только
люди, но и собаки (таблица zhivotnye), кошки и марсиане (таблица
inoplanetyane), блохи, депутаты (чисто теоретически) и глисты (таблица
parazity). В этом случае, даже зная тип Родительского элемента,
непонятно как определить нужную SQL-таблицу.

Насколько я понял у вас пассажиры связаны с вагонами. Для того, чтобы учесть возможность наличия пассажиров различных типов (кошек, людей, марсиан) можно использовать промежуточную таблицу связей vagon_passager_relation, состоящую из трех полей:

id_1 - id вагона;
id_2 - id пассажира из какой-либо таблицы;
reference_table_name - название таблицы в которой искать id_2.

Целостность данных в этом случае нужно обеспечивать через триггеры. Например, при удалении строки из таблицы люди, в триггере AFTER DELETE проверять наличие ссылки на данную строку в таблице vagon_passager_relation и удалять.

Источник

Вам также может быть интересно:

Drag and Drop UWP — c# xaml mvvm
Вопрос: Нужно иметь возможность добавлять изображения в приложение путем перетаскивания из файловой системы У Grid включил AllowDrop. Но как добавить перетаскиваемые изображения в коллекцию? Т.к. те ...
Растягивание Высоты , Резина — html css html5
Вопрос: Здравствуйте! Реализовал резиновый дизайн. Растягивается ширина, но длина по % не растягивается. Возможно ли это реализовать? Или так и задумано, растягивание только на ширину ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
Jquery position().left Как быть на мобильниках? — javascript jquery css
Вопрос: На мобильных устройствах, если зумишь экран, position всегда разный. $('g').position().left Как сделать так, чтобы он не менял свои значения? Автор вопроса: ...
requestAnimation и очередность отрисовки — javascript canvas
Вопрос: Здравствуйте! Реализовал 2D игру и в Edge работает все плавно и круто, но в Firefox'e подвисает, сказали, что нужно сделать, чтобы раз-два момент и все ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Контекстное/всплывающее меню в Android — java android popup
Вопрос: Есть ли техническая возможность сделать приложение, добавляющее свое контекстное или всплывающее меню в любом месте системы? Хочу, чтобы при выделении любого текста появлялась дополнительная кнопка ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
Завершить службы циклом — c# windows-service
Вопрос: Можно ли остановить службы циклом? У меня есть список служб, занёс их в List List<string> name = new List<string> { "AdobeARMservice", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV", ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
RecyclerView — разная разметка — android recyclerview
Вопрос: Смотрел, я смотрел в сторону RecyclerView и наконец решил кинуть ListView и на тебе! В "плохом прошлом" мой ListView использовался для двух разметок. Сейчас я ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
Как правильно передать массив аргументом для пользовательской функции — php
Вопрос: Если не брать в функцию все это, тогда результат работает. А если вот так в функции все выполнять, тогда PHP ругается: «Invalid ...
ViewPager внутри ViewPager — такие матрешки работают? — android viewpager
Вопрос: Доброго времени суток. Назрела новая задача. Есть каталог мастеров. При выборе конкретного мастера открывается его страница (активити с ViewPager), и теперь мастеров можно перелистывать свайпом. ...
Почему id всегда 1 Yii2 — yii авторизация
Вопрос: Использую все как по документации. Для получения информации о пользователе использую $identity = $model->findOne(]); И каким бы не был email, id пользователя всегда ...

Оставьте ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *