I'd like to have column constraint based combination of 2 columns. I don't find the way to use foreign key here, because it should be conditional FK, then. Hope this basic SQL shows the problem:
CREATE TABLE performer_type ( id serial primary key, type varchar ); INSERT INTO performer_type ( id, type ) VALUES (1, 'singer'), ( 2, 'band'); CREATE TABLE singer ( id serial primary key, name varchar ); INSERT INTO singer ( id, name ) VALUES (1, 'Robert'); CREATE TABLE band ( id serial primary key, name varchar ); INSERT INTO band ( id, name ) VALUES (1, 'Animates'), ( 2, 'Zed Leppelin'); CREATE TABLE gig ( id serial primary key, performer_type_id int default null, /* FK, no problem */ performer_id int default null /* want FK based on previous FK, no good solution so far */ ); INSERT INTO gig ( performer_type_id, performer_id ) VALUES ( 1,1 ), (2,1), (2,2), (1,2), (2,3); Now, the last INSERT works, but for last 2 value pairs I'd like it fail, because there is no singer ID 2 nor band ID 3. How to set such constraint?
I already asked similar question in Mysql context and only solution was to use trigger. Problem with trigger was: you can't have dynamic list of types and table set. I'd like to add types (and related tables) on the fly.
I also found very promising pattern, but this is upside down for me, I did not figured out, how to turn it to work in my case.
What I am looking here seems to me so useful pattern, I think there must be some common way for it. Is it?
Edit.
Seems, I choose bad items in my examples, so I try make it clear: different performer tables (singer and band) have NO relation between them. gig-table just has to list tasks for different performers, without setting any relations between them.
Another example would items in stock: I may have item_type-table, which defines hundreds of item-types with related tables (for example, orange and house), and there should be table stock which enlists all appearances of items.
PostgreSQL I use is 9.6
performer_typemay contain hundreds types, every row has corresponding table. Thegig-table is itself basically junction table between types-table and corresponding performer table. Can't see how separate junction table can solve problem?bandandsinger(and maybepainterandactoretc) have pretty different set of properties on their tables. Those tables may be also different product classes and there would bestockorsalesjunction tables to have them together in some common aspect, but in basics they are so different objects you can't but them in same table.