Russian Qt Forum

Qt => Базы данных => Тема начата: svch от Январь 07, 2007, 11:59



Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: svch от Январь 07, 2007, 11:59
Есть две таблицы БД, они определены так:
create table man (
   id integer not null primary key,
   name Varchar(60) NOT NULL,
   id_city Integer NOT NULL
);

create table city (
   id integer not null primary key,
   title Varchar(40) NOT NULL,
);

В TableView таблицы MAN (в поле id_city) должно отображаться поле title таблицы CITY. Это отношение я определяю так:
Код:
tableModel->setRelation(2, QSqlRelation("city", "id", "title"));

Но почему то таблица не отображается. Если я убираю строчку с определением отношения, то таблица отображается. Использую Qt 4.2 и СУБД Firebird(но это думаю неважно). Если в качестве СУБД использую SQLite, то этот код работает и таблица отображается вместе с отношением.

Подскажите пожалуйста в чем проблема? Может таблицу надо определить как-то по-другому или отношение между таблицами в QSqlRelationalTableModel? Раскажите как вы это делаете ПЛИЗ (очень надо, а то отчислят из института нафиг:) шучу)


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: Admin от Январь 07, 2007, 20:57
скорее что то в поддержке драйвера Firebird, если все на sqllite работает!


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: svch от Январь 08, 2007, 12:37
Цитата: "Admin"
скорее что то в поддержке драйвера Firebird, если все на sqllite работает!

Ты оказался прав на все 100 (пасиб). Я использовал Firebird 1.5.3 который уже у меня стоял когда я компилировал Qt. Qt сама нашла firebird и сделалала DLLку для поддержки firebird. Сегодня скачал свежий firebird 2.0 скомпилировал драйвер и... ВСЕ ЗАРАБОТАЛО!!!
Спасибо ув. админу за совет :D


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: Alex03 от Январь 08, 2007, 14:57
Порой проще сразу запрос прописать какой надо :)

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: Steven_Orko от Январь 08, 2007, 17:18
Цитата: "Alex03"

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.


В случае предложенного запроса то точно не проще, и уж тем более не оптимальнее, т.к. вложенные запросы выполняются гораздо медленнее. Кстати, не уверен в правильности предложенного варианта.

Лучше использовать следующую альтернативу:
Код:

SELECT man.id, man.name, city.title FROM man, city WHERE city.id = man.id_city;


И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы....


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: Alex03 от Январь 08, 2007, 19:48
Цитата: "Steven_Orko"
Цитата: "Alex03"

SELECT id, name, (SELECT title from city where id = man.id_city) as city_name from man;
Ну или тоже самое но с джойнами.


В случае предложенного запроса то точно не проще, и уж тем более не оптимальнее, т.к. вложенные запросы выполняются гораздо медленнее. Кстати, не уверен в правильности предложенного варианта.


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



Цитировать

Лучше использовать следующую альтернативу:
Код:

SELECT man.id, man.name, city.title FROM man, city WHERE city.id = man.id_city;


И дополнительное связывание (джойны) вовсе не к чему, только занимать дополнительные ресурсы....


Ваш вариант есть не что иное как неявный джойн, который вполне корректен (и логичен) для приведённого примера пока не появились другие таблицы, условия, или столбцы с нулевыми значениями (как то man.id_city).

Впрочем всё это уже не по теме.


Название: Связь между таблицами БД (QSqlRelationalTableModel)
Отправлено: Admin от Январь 09, 2007, 17:26
насчет вложенных запросов - они не везде работают!
например sqllite и mysql4 - там с эти трудновато!