Search Postgresql Archives

Re: Foreign key constraint question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On Jul 20, 2007, at 7:01 PM, Jeff Davis wrote:

On Fri, 2007-07-20 at 09:27 -0500, Perry Smith wrote:
On Jul 20, 2007, at 9:06 AM, Michael Fuhr wrote:

On Fri, Jul 20, 2007 at 08:57:25AM -0500, Perry Smith wrote:
I want to do something like this:

ALTER TABLE companies ADD CONSTRAINT fk_companies_item_id
             FOREIGN KEY (item_id, 'Company')
             REFERENCES item_bases(item_id, item_type)
             INITIALLY DEFERRED

I could add a column to companies that is always set to "Company" but that seems like a waste. I tried the above and I got a syntax error.

What purpose is the constraint intended to achieve?

I am trying to create a polymorphic item.  item_bases holds the
item_id and item_type.  Different tables like companies, people, etc
will hold the data.  This example is for companies.  The item_type
does not hold the actual table name but holds the "class" name.

Is there a reason you're storing the type (or, to be precise, a more
specific type) of the entity as a _value_ in the table that holds
attributes of the super type?

That seems limiting, and means you can only have one extra level of
specificity in your entity type.

Better to just not include the type of the entity as a value at all. If you want only companies, join item_bases to companies and the join will
eliminate any non-company entities from the result (because the non-
company entities in item_bases will have no matching tuple in
companies).

The relational model handles inheritance and polymorphism very well if
you don't store types as values.

What if I have just an id for an item? This will happen when another table references an item. How do I know what type it is? Are you suggesting I look in companies, people, etc, etc to find the type? It would seem better to have a table that tells me the type. Then retrieve the item from the specified table.

The idea is that the item_id will be the same in item_bases and in
companies (to pick an example).  I want to make sure that the
item_base points to an item and the item points back to the item_base.

I can add a check constraint to item_base to make sure that with the
item_id and item_type it references a record in the right table.  But
I can not defer that.  So, I plan to add to the companies table
first, then add to item_bases table.


You can use a constraint trigger. The current docs say that's "not
intended for general use," but it will be available for general use in
8.3. And those can be deferred.

I saw those but where scared away from them because of the "not for general use".

With my somewhat limited experience, I figured that applied to me.

Thank you again for your help,
Perry



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux