Database Design Advice
William Blunn
bill+london.pm at blunn.org
Thu Nov 7 14:57:14 GMT 2013
On 07/11/2013 13:03, Smylers wrote:
> A purchase consists of ordering one product from a supplier. Each
> product is only available from a single supplier. So a record in the
> purchase table just needs to store a product ID, and by linking
> through the product table that defines the supplier too.
>
> A purchase will also be handled by a particular contact at the
> supplier. Again, the purchase table can link to the supplier_contact
> table, which in turn links to the supplier.
>
> Except there's now two (indirect) links from the purchase table to the
> supplier table. Can the database enforce that they both go to the same
> supplier? (That is, that a purchase handled by a particular contact
> must be for a product sold by that contact's company?)
I assume your purchase table has foreign key constraints
product_id -> product (id)
contact_id -> contact(id)
And you want to ensure that for a given purchase row that
product(supplier_id) = contact(supplier_id)?
You could add supplier_id to the purchase table.
Now this will create a denormalisation. To ensure that your data does
not become inconsistent, you need to extend your foreign key constraints
on the purchase table to be:
(product_id, supplier_id) -> product(id, supplier_id)
(contact_id, supplier_id) -> contact(id, supplier_id)
This will guarantee that you have no non-existent (product_id,
supplier_id) or (contact_id, supplier_id) tuples in the purchase table.
So the data integrity ill-effects of denormalisation are resolved.
Having done this, any row in the purchase table will now point to a
product and a contact relating to the (one) supplier mentioned in the
purchase row itself, which means that the product and contact will
always relate to the same supplier.
I used this approach in anger at a former employer and it worked well.
Regards,
Bill
More information about the london.pm
mailing list