Re: Database query: Notification about change? - Mailing list pgsql-sql
From | Erik Sigra |
---|---|
Subject | Re: Database query: Notification about change? |
Date | |
Msg-id | 4394E2A2.1050301@kth.se Whole thread Raw |
In response to | Re: Database query: Notification about change? (Bruno Wolff III <bruno@wolff.to>) |
Responses |
Re: Database query: Notification about change?
|
List | pgsql-sql |
Bruno Wolff III wrote: >On Mon, Dec 05, 2005 at 19:22:22 +0100, > Erik Sigra <sigra@kth.se> wrote: > > >>Hi, >>I plan to develop an application that is somewhat like a spreadsheet >>with cells containing formulas. When a cell value is changed, things >>must be updated. But the formulas can contain database queries, which >>means that the cell has to be notified when the database changes in such >>a way that the result of the query changes. How is this done? I would >>really like to avoid recalculating the whole thing for each change to >>the database. >> >>I looked in my database book and read about materialized views and >>triggers. It seems like I should do the following: >>1. Make a materialized view from the query. >>2. Add a trigger for changes to this view. >>3. Make the trigger notify the application program when it is trigged. >> >>Would this be possible? (I was planning to use Qt for application >>programming and database access.) >> >> > >Postgres provides the NOTIFY command >(http://developer.postgresql.org/docs/postgres/sql-notify.html) >and you could use that in appropiate triggers to let your application know >that it needs to refresh that values in at least some cells. >You shouldn't need to use materialized views though. Just put the triggers >on the base tables. > Thanks for the hint! I thought I need to put the triggers on materialized views. If I would have to put them on the base tables, the application program would have to understand the query to figure out which tables it uses. I really do not want to make a parser for SQL. What if the user of the spreadsheet-like application enters a formula containing a query like this: select distinct t1.person_id--, t1.sport_id, t2.sport_id from (select distinct sport_id,person_id from (-- hitta sporten för varje lopp_match select * from (select lopp_match_id, sport_id from ensamlopp_match natural join ensamgrentävling natural join grentävling natural join gren) as t union (select lopp_match_id, sport_id from laglopp_match naturaljoin laggrentävling natural join grentävling natural join gren)) as t natural join resursbokning natural join personresurs natural join resurstyp where resurstyp_namn = 'domare') as t1, (selectdistinct sport_id, person_id from (-- hitta sporten för varje lopp_match select * from (select lopp_match_id, sport_id from ensamlopp_match natural join ensamgrentävling natural join grentävling natural join gren) as t union (select lopp_match_id, sport_id from laglopp_match natural join laggrentävling natural join grentävling natural join gren)) as t natural join resursbokning natural join personresurs natural join resurstyp where resurstyp_namn= 'domare') as t2 where t1.sport_id != t2.sport_id and t1.person_id = t2.person_id; ? (Example query taken from a university course project.) I do not want the application program to do anything more complex with the query than adding "create view <some-name> as" in front of it and then add some trigger or whatever. And I think it will be much more efficient to watch a materialized view than to rerun the query whenever one of the base tables change. That is what materialized view optimization is about, right? A typical query might look like this: select sum(price * fraction_deductible) from yearxxxx_expenditures; Thanks. I hope it is possible to understand what I wrote eventhough I do not know that much about practical database programming. Erik