我正在编写一个用于存储一些数据的数据库访问应用程序,并想问一些关于模型/视图架构的问题。
(使用:Qt 4.7.4,自己构建;PostgreSQL 9.0;目标:WinXP、Win7(32/64 位))首先让我解释一下我想要实现的目标以及我目前的位置。
我有两个页面(插入 QStackedWidget 中的子类 QWidget),QTableView 绑定到模型。每个视图都绑定到 PostgreSQL 服务器中的一个表。您可以添加/编辑/删除/排序/过滤项目。每个页面只能被一种类型的用户看到,我们称之为角色 Role1 和 Role2。
与模型相关的所有东西的提交策略都是 OnManualSubmit。
(事务隔离级别 = Serializable。)当两个用户想要编辑(例如)同一行时,我想做一个“SELECT ... FOR UPDATE”查询 - 以确保当有人编辑某些东西时,他会合并他的用较新的更改(如果有的话,就像在 SVN 中一样)。但我只看到 QSqlTableModel 的 submitAll() 方法。也许捕捉信号 beforeUpdate()、beforeDelete()、beforeInsert() 并手动执行“SELECT ... FOR UPDATE”是一种选择。我认为的另一种方法是继承 QSqlTableModel。实现这一目标的干净而好的方法是什么?
我想定期更新每个页面的 QSqlTableView(最多只能看到一个页面,Role1 用户只能访问 Page1,Role2 => Page2 也是如此)。我想到的第一件事是使用 QTimer 并手动调用 QSqlTableModel 的 select(),但是......不确定这是否很酷。
我还想定期检查与数据库的连接是否正常,但我认为 QTimer + QSqlDatabase::isOpen () 就可以了。
现在,这两个表具有相同的主键,并且某些列是相同的。我希望当具有 Role1 的用户更改 Table1 中的一行时,自动更改 Table2 的相应列,反之亦然。我应该在 Postgres 中创建触发器吗?
顺便说一句,数据库很小 - 两个表中的每一个都大约 3-4000 行,大约 10 列(主要是 varchars,1 个文本和 2 个日期列)。
感谢阅读,新年快乐!:)