From: | "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com> |
---|---|
To: | David Gauthier <davegauthierpg(at)gmail(dot)com> |
Cc: | pgsql-general <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Need a referential constraint to a non-unique record |
Date: | 2019-06-25 22:18:56 |
Message-ID: | CAKFQuwaCQc5O4yPZ9qoxVOHPE=rSHZ+h7UVz2VqrBkpW-FzjyQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Tue, Jun 25, 2019 at 2:58 PM David Gauthier <davegauthierpg(at)gmail(dot)com>
wrote:
> I need to create a constraint on a column of a table such that it's value
> is found in another table but may not be unique in that other table.
> Example...
>
This requires a trigger
>
> Let's say the DB is about students and the grades they got for 4
> subjects... Math, English, Science, History. But instead of creating 4
> records in the "grades" table for every record in the "students" table, I
> storing each unique combination of grades in the "grades" table, those
> records tied together with a common "id" field...
>
> grade_id subject grade
> 1 math A
> 1 english A
> 1 science A
> 1 history A
> 2 math B
> 2 english A
> 2 science C
> 2 history B
>
> etc... Each unique combination of the 4 subject/grades gets a new "id"
> and those 4 records are written to the grates table.
>
> Now, in the "students" table I have a "grad_id" column which points to the
> set of grades for that student. The "grade_id" value in the "students"
> table must also exist in the "grades" table. But the grade_id value is
> pointing to 4, not 1 record in the "grades" table. And "grade_id" in the
> "grades" table can't (obviously) be a PK.
>
IMO this is a poorly chosen model. If you think this is a good idea you
should go ahead and represent the subjects as columns and have a single row.
>
> There are no primary keys in this scenario so I don't think I can set up a
> traditional primary-foreign key relationship.
>
Correct
> I could do this with a check constraint.
>
No, a check constraint will not work.
> But I want the ER view in the DBeaver tool to recognize the constraint
> and depict it.
>
Which requires PK/FK semantics
>
> I suppose I could create a bridge table between the "students" and
> "grades" table which has only the "grades_id" column as a primary key, and
> then set up 2 traditional primary/foreign key constraints (one between this
> new table and "grades", and the other between this new table and
> "students").
>
> But it's kinda unnecessary and am looking for something more direct,
> without the bridge.
>
Store (student, subject, grade) ...
Any ideas ?
>
You seem to understand the options that are open to you just fine. If
neither are agreeable then maybe the problem is a poor choice of model.
> psql (9.6.7, server 9.5.2) on linux
>
You may wish to consider upgrading your client and server software
David J.
From | Date | Subject | |
---|---|---|---|
Next Message | Adrian Klaver | 2019-06-26 00:19:31 | Re: Need a referential constraint to a non-unique record |
Previous Message | Peter Geoghegan | 2019-06-25 22:12:48 | Re: REINDEX : new parameter to preserve current average leaf density as new implicit FILLFACTOR |