Re: Adding columns to a view - Mailing list pgsql-general

From Ingo van Lil
Subject Re: Adding columns to a view
Date
Msg-id 20051228182927.GA883@herkules.hrz.tu-chemnitz.de
Whole thread Raw
In response to Re: Adding columns to a view  (merlyn@stonehenge.com (Randal L. Schwartz))
Responses Re: Adding columns to a view
List pgsql-general
On 28 Dec 2005, Randal L. Schwartz wrote:

>> Well, in my case the situation is further complicated by the fact that
>> adding a column to the view should be done automatically from a trigger
>> function. I wanted some kind of matrix view that had a column for every
>> row in a certain table. And whenever a new line was inserted into that
>> table the view should automatically be extended by one column.
>
> This seems wrong, with the same spidey sense tingling that triggered (ugh :)
> yesterday when I said "sending mail from the database is wrong".
> Your tables shouldn't change during the execution of your application.

You're probably right about extending the view automatically -- I have
to admit it's a pretty sick idea. But the general idea about adding new
columns to that view still seems reasonable to me.

Let me explain my current situation: I'm using Postgres for management
of a student network with some 1500 users and about 2000 hosts. We have
one table that holds information about all the users (primary key
'person_id') and another table that holds a set of possible status flags
that may be assigned to users (primary key 'status_id'). A third table
assigns those status flags to users for a certain interval:

CREATE TABLE user_has_status (
        id SERIAL PRIMARY KEY,
        person_id   integer   NOT NULL REFERENCES person(person_id),
        status_id   integer   NOT NULL REFERENCES status(status_id),
        valid_from  timestamp NOT NULL,
        valid_until timestamp NOT NULL
);

Now, if I want to get a list of users that have a certain combination of
valid status entries (e.g. all users that have paid their annual fee and
are not banned for some reason), I have to use several subselects:

SELECT person_id FROM person WHERE
    EXISTS (SELECT 1 FROM status WHERE status_id=1
            AND CURRENT_TIMESTAMP BETWEEN valid_from AND valid_until)
    AND NOT
    EXISTS (SELECT 1 FROM status WHERE status_id=2
            AND CURRENT_TIMESTAMP BETWEEN valid_from AND valid_until);

This is what I'd like to simplify: My matrix view should contain one
line for each user and one boolean column for each possible status flag.
The field content should be 'true' if the selected user has a currently
valid status entry assigned to it. The above statement could be written
a great deal shorter as:

SELECT person_id FROM person_status_matrix WHERE paid AND NOT banned;

The only problem: From time to time we need to add some new
functionality and need to introduce a new status entry. And in those
cases the matrix view needs to get a new column. That's why I'd like to
extend it without dropping all the views that might depend on it.

        Cheers,
            Ingo


pgsql-general by date:

Previous
From: Reid Thompson
Date:
Subject: Re: FW: FW: Re[2]: new beginner to postgresql. Looking
Next
From: Eugene
Date:
Subject: Re: POSTGRES DB 3 800 000 rows table, speed up?