Russian Qt Forum

Qt => Базы данных => Тема начата: demaker от Август 20, 2016, 12:06



Название: бд связь один ко многим
Отправлено: demaker от Август 20, 2016, 12:06
Никогда не писал ПО для БД. Надо написать клиента для БД.
Читал доки по QtSql но так и не понял как реализовать связь
"один ко многим". Есть класс  QSqlRelationTableModel
с помощью которого можно реализовать связь "один к одному".
Не могли бы вы привести пример реализации или наставить на путь
истинный.


Название: Re: бд связь один ко многим
Отправлено: break от Сентябрь 06, 2016, 21:11
Мне видится только один правильный путь.

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

ROW_ID | TABLE_1_ROW_ID | TABLE_2_ROW_ID

ROW_ID - собственный суррогатный ключ таблицы связей
TABLE_1_ROW_ID И TABLE_2_ROW_ID - ключи связываемых таблиц

По полям TABLE_1_ROW_ID И TABLE_2_ROW_ID должен быть создан уникальный индекс

Далее для вывода на клиент - как больше нравится или запрос с джойнами или хранимая процедура, если сервер БД их поддерживает. То есть этот запрос или ХП выводит уже не ИД-шники, а данные с ними связанные в своих таблицах.

Вызов ХП или запрос кладется в QSqlQueryModel - ну и все в таблице будет видно.

НО функционал QSqlQueryModel крайне ограничен и уже добавлять и редактировать/удалять записи через нее быдет сложно, т.к. нельзя задать отдельных запросов InsertSQL, RemoveSQL и т.д. Мне пришлось для таких целей писать свою модель.