Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread சிவகுமார் மா
On Nov 15, 2007 8:17 PM, Sam Mason [EMAIL PROTECTED] wrote:
 As Albe suggested, a view is about all that's going to help the poor
 people who work with this.  When I do this sort of thing, I tend to
 find that there are very few queries that actually need everything all
 together in one place.

True in our case also.

 It's generally that (using the naming above)
 that you'd do a query on table1, test and something that references
 test.  Queries that reference test, table1 and table2 are
 reasonably rare.  Of course, it could be that I was just lucky here.

Now I know we are not alone handling these type of tables :-)

Best regards,

Ma Sivakumar



-- 
மா சிவகுமார்
எல்லோரும் எல்லாமும் பெற வேண்டும்
http://masivakumar.blogspot.com

---(end of broadcast)---
TIP 1: if posting/reading through Usenet, please send an appropriate
   subscribe-nomail command to [EMAIL PROTECTED] so that your
   message can get through to the mailing list cleanly


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread Sam Mason
On Thu, Nov 15, 2007 at 01:24:04PM +0530, ??? ?? 
wrote:
 Is there a way to force join conditions in queries i.e. When a join is
 made to a table on a particular field, another column should also be
 checked?
 
 CREATE TABLE test (info_type varchar(3), info_reference integer);
 (depending on info_type, info_reference will contain key values from
 different tables)
 
 INSERT INTO test (info_type, info_reference) values ('abc','111'); --- 111 
 from tableA
 INSERT INTO test (info_type, info_reference) values ('def','101'); --- 101 
 from tableB
 INSERT INTO test (info_type, info_reference) values ('abc','119'); --- 119 
 from tableA

What I tend to do here, is something like:

  CREATE TABLE test (
type  INTEGER,
ref1 INTEGER REFERENCES table1 CHECK ((type = 1) = (ref1 IS NOT NULL)),
ref2 INTEGER REFERENCES table2 CHECK ((type = 2) = (ref2 IS NOT NULL)),
ref3 INTEGER REFERENCES table3 CHECK ((type = 3) = (ref3 IS NOT NULL))
  );

yes it means that you get lots of null columns, but PG is reasonably
good about handling them.  When you're writing queries that use the
table, then you have to do lots of OUTER JOIN's to get everything you
need together.  I asked about this a few weeks ago, but never got any
suggestions about better ways to do things.


  Sam

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread சிவகுமார் மா
On Nov 15, 2007 7:32 PM, Albe Laurenz [EMAIL PROTECTED] wrote:

 You want to have a conditional foreign key reference that checks
 against different tables depending on a type field, right?

 For complicated conditions like this, you could use a
 BEFORE INSERT trigger that throws an error when the condition
 is violated.

That we do. My query is to put a check on select queries to avoid
programmers not using all the necessary conditions.

Thanks and regards,
Ma Sivakumar


-- 
மா சிவகுமார்
எல்லோரும் எல்லாமும் பெற வேண்டும்
http://masivakumar.blogspot.com

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread சிவகுமார் மா
On Nov 15, 2007 5:52 PM, Sam Mason [EMAIL PROTECTED] wrote:
 What I tend to do here, is something like:

   CREATE TABLE test (
 type  INTEGER,
 ref1 INTEGER REFERENCES table1 CHECK ((type = 1) = (ref1 IS NOT NULL)),
 ref2 INTEGER REFERENCES table2 CHECK ((type = 2) = (ref2 IS NOT NULL)),
 ref3 INTEGER REFERENCES table3 CHECK ((type = 3) = (ref3 IS NOT NULL))
   );

Thanks for sharing. Will try it. But, we have more than 10 types in
one table. Will be tough to handle.

Ma Sivakumar
-- 
மா சிவகுமார்
எல்லோரும் எல்லாமும் பெற வேண்டும்
http://masivakumar.blogspot.com

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org/


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread Albe Laurenz
சிவகுமார் மா wrote:
 You want to have a conditional foreign key reference that checks
 against different tables depending on a type field, right?

 For complicated conditions like this, you could use a
 BEFORE INSERT trigger that throws an error when the condition
 is violated.
 
 That we do. My query is to put a check on select queries to avoid
 programmers not using all the necessary conditions.

You can create a view that does the join the correct way
(maybe a UNION of two different joins) and give the programmers
access to that view, but not to the underlying tables.

Yours,
Laurenz Albe

---(end of broadcast)---
TIP 4: Have you searched our list archives?

   http://archives.postgresql.org/


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread Sam Mason
On Thu, Nov 15, 2007 at 07:46:46PM +0530, ??? ?? 
wrote:
 On Nov 15, 2007 5:52 PM, Sam Mason [EMAIL PROTECTED] wrote:
  What I tend to do here, is something like:
 
CREATE TABLE test (
  type  INTEGER,
  ref1 INTEGER REFERENCES table1 CHECK ((type = 1) = (ref1 IS NOT NULL)),
  ref2 INTEGER REFERENCES table2 CHECK ((type = 2) = (ref2 IS NOT NULL)),
  ref3 INTEGER REFERENCES table3 CHECK ((type = 3) = (ref3 IS NOT NULL))
);
 
 Thanks for sharing. Will try it. But, we have more than 10 types in
 one table. Will be tough to handle.

As Albe suggested, a view is about all that's going to help the poor
people who work with this.  When I do this sort of thing, I tend to
find that there are very few queries that actually need everything all
together in one place.  It's generally that (using the naming above)
that you'd do a query on table1, test and something that references
test.  Queries that reference test, table1 and table2 are
reasonably rare.  Of course, it could be that I was just lucky here.


  Sam

---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [GENERAL] Enforcing Join condition

2007-11-15 Thread Albe Laurenz
சிவகுமார் மா wrote:
 CREATE TABLE test (info_type varchar(3), info_reference integer);
 (depending on info_type, info_reference will contain key values from
 different tables)
 
 INSERT INTO test (info_type, info_reference) values ('abc','111'); ---
 111 from tableA
 INSERT INTO test (info_type, info_reference) values ('def','101');
 --- 101 from tableB
 INSERT INTO test (info_type, info_reference) values ('abc','119'); ---
 119 from tableA
 INSERT INTO test (info_type, info_reference) values ('def','103');
 --- 103 from tableB
 INSERT INTO test (info_type, info_reference) values ('def','104');
 --- 104 from tableB
 INSERT INTO test (info_type, info_reference) values ('def','105');
 --- 105 from tableB
 INSERT INTO test (info_type, info_reference) values ('def','111');
 --- 111 from tableB
 
 Now when joining tableA or tableB with test, joining only
 info_reference will be wrong, we should also mention the info_type
 value.
 
 1. Is this an appropriate design for this requirement?
 2. Is there a way to enforce the dual condition checking on all
 queries. If a join is made to info_reference, info_type should also be
 specified?

I think I understand:

You want to have a conditional foreign key reference that checks
against different tables depending on a type field, right?

For complicated conditions like this, you could use a
BEFORE INSERT trigger that throws an error when the condition
is violated.

Yours,
Laurenz Albe

---(end of broadcast)---
TIP 5: don't forget to increase your free space map settings


[GENERAL] Enforcing Join condition

2007-11-14 Thread சிவகுமார் மா
Is there a way to force join conditions in queries i.e. When a join is
made to a table on a particular field, another column should also be
checked?

CREATE TABLE test (info_type varchar(3), info_reference integer);
(depending on info_type, info_reference will contain key values from
different tables)

INSERT INTO test (info_type, info_reference) values ('abc','111'); ---
111 from tableA
INSERT INTO test (info_type, info_reference) values ('def','101');
--- 101 from tableB
INSERT INTO test (info_type, info_reference) values ('abc','119'); ---
119 from tableA
INSERT INTO test (info_type, info_reference) values ('def','103');
--- 103 from tableB
INSERT INTO test (info_type, info_reference) values ('def','104');
--- 104 from tableB
INSERT INTO test (info_type, info_reference) values ('def','105');
--- 105 from tableB
INSERT INTO test (info_type, info_reference) values ('def','111');
--- 111 from tableB

Now when joining tableA or tableB with test, joining only
info_reference will be wrong, we should also mention the info_type
value.

1. Is this an appropriate design for this requirement?
2. Is there a way to enforce the dual condition checking on all
queries. If a join is made to info_reference, info_type should also be
specified?

Thanks.

Ma Sivakumar
-- 
மா சிவகுமார்
எல்லோரும் எல்லாமும் பெற வேண்டும்
http://masivakumar.blogspot.com

---(end of broadcast)---
TIP 9: In versions below 8.0, the planner will ignore your desire to
   choose an index scan if your joining column's datatypes do not
   match