Re: Function or Field?

Lists: pgsql-sql
From: lucas(at)presserv(dot)org
To: pgsql-sql(at)postgresql(dot)org
Subject: Function or Field?
Date: 2005-05-02 20:16:44
Message-ID: 20050502171644.dqce2vmgefi80kwo@www.presserv.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Hi.
What is the better way to store the last record for a translation???
I.E:
The data for the last product vendding.
What is better:
a) Create a field in "product" table and create a Trigger (before insert or
update into vendding table) to alter this field.
b) Create a view or function that check the all venddings (in vendding table)
for the specified product and return the last vendding information?

a)
CREATE TABLE products(
id serial primary key,
description varchar(50),
last_vendding date() --Is correct to use this field???
);
CREATE TABLE vendding(
id serial primary key,
date_ date,
product integer references (products)
);
CREATE TRIGGER TG_change_products_last_vendding_field on table vendding BEFORE
INSERT OR UPDATE FOR EACH ROW EXECUTE procedure
change_products_last_vendding();

b)
CREATE TABLE products (
id serial primary key,
description varchar(50)
);
CREATE TABLE vendding(
id serial primary key,
date_ date,
product integer references (products)
);
CREATE VIEW last_product_change as SELECT * from vendding order by date_ desc
limit 1; --Okay, this view will return the last record and not the last record
for a product... but its a example.

I am asking it becouse I have used CLIPPER(dbase) for my old programs and in
DBASE the view/check function that will check for each select is not
functional. And I need to create a field in all table references, but in DBASE
this fields allways broken and I need to recheck it.

Thank you.


From: "Joel Fradkin" <jfradkin(at)wazagua(dot)com>
To: <lucas(at)presserv(dot)org>, <pgsql-sql(at)postgresql(dot)org>
Subject: Re: Function or Field?
Date: 2005-05-02 21:10:45
Message-ID: 001101c54f5b$685275e0$797ba8c0@jfradkin
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

You could also make a table with just that data in it so you don't have the
field in all the records and you don't have to check all the records to see
what is next.

I am assuming this is some kind of a flag values used in a batch, if you
just need the last id I use max(id)+1.

Joel Fradkin

Wazagua, Inc.
2520 Trailmate Dr
Sarasota, Florida 34243
Tel. 941-753-7111 ext 305

jfradkin(at)wazagua(dot)com
www.wazagua.com
Powered by Wazagua
Providing you with the latest Web-based technology & advanced tools.
C 2004. WAZAGUA, Inc. All rights reserved. WAZAGUA, Inc
This email message is for the use of the intended recipient(s) and may
contain confidential and privileged information. Any unauthorized review,
use, disclosure or distribution is prohibited. If you are not the intended
recipient, please contact the sender by reply email and delete and destroy
all copies of the original message, including attachments.

-----Original Message-----
From: pgsql-sql-owner(at)postgresql(dot)org [mailto:pgsql-sql-owner(at)postgresql(dot)org]
On Behalf Of lucas(at)presserv(dot)org
Sent: Monday, May 02, 2005 3:17 PM
To: pgsql-sql(at)postgresql(dot)org
Subject: [SQL] Function or Field?

Hi.
What is the better way to store the last record for a translation???
I.E:
The data for the last product vendding.
What is better:
a) Create a field in "product" table and create a Trigger (before insert or
update into vendding table) to alter this field.
b) Create a view or function that check the all venddings (in vendding
table)
for the specified product and return the last vendding information?

a)
CREATE TABLE products(
id serial primary key,
description varchar(50),
last_vendding date() --Is correct to use this field???
);
CREATE TABLE vendding(
id serial primary key,
date_ date,
product integer references (products)
);
CREATE TRIGGER TG_change_products_last_vendding_field on table vendding
BEFORE
INSERT OR UPDATE FOR EACH ROW EXECUTE procedure
change_products_last_vendding();

b)
CREATE TABLE products (
id serial primary key,
description varchar(50)
);
CREATE TABLE vendding(
id serial primary key,
date_ date,
product integer references (products)
);
CREATE VIEW last_product_change as SELECT * from vendding order by date_
desc
limit 1; --Okay, this view will return the last record and not the last
record
for a product... but its a example.

I am asking it becouse I have used CLIPPER(dbase) for my old programs and in
DBASE the view/check function that will check for each select is not
functional. And I need to create a field in all table references, but in
DBASE
this fields allways broken and I need to recheck it.

Thank you.

---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend


From: lucas(at)presserv(dot)org
To: Joel Fradkin <jfradkin(at)wazagua(dot)com>
Cc: pgsql-sql(at)postgresql(dot)org
Subject: Re: Function or Field?
Date: 2005-05-03 11:58:24
Message-ID: 20050503085824.kx88ad92vqhwwww0@www.presserv.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

Do I have to create another table to put this data???
But, Isn't it redundancy? :-/

The question is: For example:
I have a "clients" table and I have a "taxes" table that is a chield
of client.
Is more efficient put fields into client table that contains:
-) the count for paid taxes
-) the count for unpaid taxes
-) the count for all taxes
-) the last tax expiration date
Or is more efficient construct a function that will count this field runtime,
as a view for example, or a simple function.
-) SELECT count(*) from taxes where client=$1 and not nullvalue(dt_pay);
-) SELECT count(*) from taxes where client=$1 and nullvalue(dt_pay);
-) SELECT count(*) from taxes where client=$1;
-) SELECT dt_expiration from taxes where client=$1 order by
dt_expiration desc
limit 1;

While having few records in "taxes" table, the function (runtime) work
right and
in good time, but when the "taxes" table grows I think the function
will run so
slow...
What is correct???
Construct a Function to count runtime? or Create a Trigger to update the
"clients" fields before all action and use those fields in select???

Thanks

Quoting Joel Fradkin <jfradkin(at)wazagua(dot)com>:

> You could also make a table with just that data in it so you don't have the
> field in all the records and you don't have to check all the records to see
> what is next.
>
> I am assuming this is some kind of a flag values used in a batch, if you
> just need the last id I use max(id)+1.
>
> Joel Fradkin
>
> Wazagua, Inc.
> 2520 Trailmate Dr
> Sarasota, Florida 34243
> Tel. 941-753-7111 ext 305
>
> jfradkin(at)wazagua(dot)com
> www.wazagua.com
> Powered by Wazagua
> Providing you with the latest Web-based technology & advanced tools.
> C 2004. WAZAGUA, Inc. All rights reserved. WAZAGUA, Inc
> This email message is for the use of the intended recipient(s) and may
> contain confidential and privileged information. Any unauthorized review,
> use, disclosure or distribution is prohibited. If you are not the intended
> recipient, please contact the sender by reply email and delete and destroy
> all copies of the original message, including attachments.
>
>
>
>
> -----Original Message-----
> From: pgsql-sql-owner(at)postgresql(dot)org [mailto:pgsql-sql-owner(at)postgresql(dot)org]
> On Behalf Of lucas(at)presserv(dot)org
> Sent: Monday, May 02, 2005 3:17 PM
> To: pgsql-sql(at)postgresql(dot)org
> Subject: [SQL] Function or Field?
>
> Hi.
> What is the better way to store the last record for a translation???
> I.E:
> The data for the last product vendding.
> What is better:
> a) Create a field in "product" table and create a Trigger (before insert or
> update into vendding table) to alter this field.
> b) Create a view or function that check the all venddings (in vendding
> table)
> for the specified product and return the last vendding information?
>
> a)
> CREATE TABLE products(
> id serial primary key,
> description varchar(50),
> last_vendding date() --Is correct to use this field???
> );
> CREATE TABLE vendding(
> id serial primary key,
> date_ date,
> product integer references (products)
> );
> CREATE TRIGGER TG_change_products_last_vendding_field on table vendding
> BEFORE
> INSERT OR UPDATE FOR EACH ROW EXECUTE procedure
> change_products_last_vendding();
>
> b)
> CREATE TABLE products (
> id serial primary key,
> description varchar(50)
> );
> CREATE TABLE vendding(
> id serial primary key,
> date_ date,
> product integer references (products)
> );
> CREATE VIEW last_product_change as SELECT * from vendding order by date_
> desc
> limit 1; --Okay, this view will return the last record and not the last
> record
> for a product... but its a example.
>
> I am asking it becouse I have used CLIPPER(dbase) for my old programs and in
> DBASE the view/check function that will check for each select is not
> functional. And I need to create a field in all table references, but in
> DBASE
> this fields allways broken and I need to recheck it.
>
> Thank you.
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>
>


From: Frank Bax <fbax(at)sympatico(dot)ca>
To: pgsql-sql(at)postgresql(dot)org
Subject: Re: Function or Field?
Date: 2005-05-03 13:41:11
Message-ID: 5.2.1.1.0.20050503092757.0532a040@pop6.sympatico.ca
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-sql

At 07:58 AM 5/3/05, lucas(at)presserv(dot)org wrote:

>Do I have to create another table to put this data???
>But, Isn't it redundancy? :-/
>
>The question is: For example:
> I have a "clients" table and I have a "taxes" table that is a chield of
> client.
> Is more efficient put fields into client table that contains:
> -) the count for paid taxes
> -) the count for unpaid taxes
> -) the count for all taxes
> -) the last tax expiration date
> Or is more efficient construct a function that will count this field
> runtime,
>as a view for example, or a simple function.
> -) SELECT count(*) from taxes where client=$1 and not nullvalue(dt_pay);
> -) SELECT count(*) from taxes where client=$1 and nullvalue(dt_pay);
> -) SELECT count(*) from taxes where client=$1;
> -) SELECT dt_expiration from taxes where client=$1 order by
> dt_expiration desc
>limit 1;
>
>While having few records in "taxes" table, the function (runtime) work
>right and
>in good time, but when the "taxes" table grows I think the function will
>run so
>slow...
>What is correct???
>Construct a Function to count runtime? or Create a Trigger to update the
>"clients" fields before all action and use those fields in select???

Placing the count fields in client table is redundant and
expensive. Creating a function with four selects in it could be slow, but
you can obtain those four data items in a single select:

SELECT
CASE WHEN dt_pay IS NULL THEN 0 ELSE count(*) END AS CountPaidTaxes,
CASE WHEN dt_pay IS NULL THEN count(*) ELSE 0 END AS CountUnPaidTaxes,
COUNT(*) AS CountTaxes,
MAX(dt_expiration) AS LastExpiry
FROM taxes WHERE client = $1;

With an index on client, this should always be quite speedy. Using "order
by dt_expiration desc
limit 1;" is a nice trick, but not useful in this case because all rows for
one client are being retrieved anyway for the other three data items.

Frank