Design patern for correct use of database and Qt views link
-
wrote on 23 Feb 2015, 08:12 last edited by
Ok, i have a QDialog box who serve to create a new "project" of the application. this project is référenced inisde a table named "projects". Then, from this dailog box, i have some view customized linked to some other tables.
a project can contain many binders, and can be link to some other location and/or structure objects.
Also, binders of the project contain many files (documentations, sheets, client files, etc... for exemple).
So, a view is linked to the table "binders", each binder inside this table has to be lonk to table "binders_linker", this table link each binder to a project.. or a structure... or a location... etc...
so, if i customize my model for the view of bonders tree... and also for files tree... and all so...
what i can do for use database transactions ?
because... i can not have id of a new row of binder before commit the insertion... same for the project new id row... so i can not have all necessary data for input inside the new binders_linker row.
so... is ther any design patern to use for do that or the best way coudl be to use variable data form for embed trees views ? -
wrote on 24 Feb 2015, 02:42 last edited by
ok, my question was not clear, i try to ask clearly:
from database:
- table name: "binder" fields name and type: "id / int and primary key auto incremented", "name / varchar", "comment / varchar", "id_tree / int", "id_tree_parent / int" * table name: "binder_linker"
fields name and type:
"id / int primary key auto incremented"
"id_binder / int and foreign key"
"id_project / int and foreign key"
"id_structure / int and foreign key"
"id_location / int and foreign key"
* table name: "projects"
fields name and type:
"id / int primary key auto incremented"
"name / varchar"
"comment / varchar"
"date_create / timestamp"
"date_close /timestamp"
* table name: "files"
"id / int primary key auto increment"
"name / varchar"
"directory / varchar"
* table name: "files_linker"
"id / int primary key auto increment"
"id_file / int foreign_key"
"id_binder /int foreign key"
the dialog box for the "new project":
it serve to create a new project after give all information about name, comment, binder to link with, and content of files inside each binder. so for the view of binders, i have a treeview with custom model frome QAbstractItemModel and promoted treeview class and "binder" class (the items element are binders...) for the files, i have also a treeview with promoted treeview class and QAbstractItemModel
so, the binder tree view is linked to the files treeview...
the problem:
at this time, in my code, i add a binder inside from the view by right click inside and from the popup menu, i choose to add (if empty or if right click on invalid index) or add a child or delete when from menu popup when right clicked on a valid index...
when i add a binder, i put datas inside a QMultiHash<int, QHash<int, QVectror<QVariant>>> variable (where first int is id_tree_parent, second int is id_tree and then QVaraiant are name and comment and eventually the id from the binder table...
so, if i delete or update a data, i work on this variable to remove, update, re-arrange id_tree numbers and own parent id_tree_parent (who are the hirearchy organisation). It is heavy...
I would like to try to use transactions from SQL (open transaction and at the end, commit) for not use the data form variable... BUT:the question:
is it possible to do it by the fact that there is many links (foreign keys) to pass to relationnal tables ?
an other form of this question could be:
when i do a "INSERT INTO binder ..... RETURNING id ;" does it return me the id (because sure... i need it for add a new binders_linker row to be able to link binders and project...) before i commit the transaction ?If this works, so i not need to use variuable to form all datas before manipulate the database.
OR... which could be the best way to do ?
- table name: "binder" fields name and type: "id / int and primary key auto incremented", "name / varchar", "comment / varchar", "id_tree / int", "id_tree_parent / int" * table name: "binder_linker"
1/2