Thank you, Sundar.
I understand. This solution means I relinquish the foreign key constraint
on the product_lots table.
It does seem simpler than using another table for raw materials.
No third alternative, I guess...
On Friday, April 20, 2012 2:37:38 AM UTC-4, Sundar wrote:
>
> Cliff
>
> By adding the 'null' to the 'purchase_order_id' in the product_lots table,
> you automatically achieve it - that is, if the field is declared as Null,
> foreign key constraint is applicable only if it is non-null and a null
> value will automatically skip validation for foreign key.
>
> Another method (not really required, I guess) is to define a 'dummy' PO
> with id as zero (or non-negative) and refer to this PO in all product lots
> which do not require any PO reference. However, this method will mean that
> you have to have an additional where clause in all selects (on the PO
> table) to exclude this specific PO.
>
> Cheers.
>
> Sundar
> ==============================================
> On Friday, April 20, 2012 3:16:24 AM UTC+5:30, Cliff wrote:
>>
>> nick,
>> Thanks for the response.
>>
>> Here's a longer explanation.
>>
>> Two applications, one is purchasing, the other is production.
>>
>> Purchasing has two tables, purchase_orders and product_lots. It's a
>> one-to-may relationship; a purchase order can have many product lots. So
>> we get:
>> db.define_table('purchase_orders', field('po_number' .....
>> db.define_table('product_lots', Field('purchase_order_id',
>> db.purchase_orders, requires=IS_IN_DB(db, 'purchase_orders.id', ...)),
>> Field('quantity_received', 'decimal'), Field('quantity_on_hand',
>> 'decimal') ...
>>
>> So, I have established a foreign table relationship between purchase
>> orders and product lots.
>>
>> Once a product_lot is released to production, the production app uses the
>> same table to find available raw materials, and decrements the
>> quantity_on_hand field as it goes. The production app neither knows nor
>> cares about the purchase order table, so the purchase_order_id field is
>> irrelevant.
>>
>> This is fine as long as all production material enters the plant via the
>> purchasing process. However, this is not the case. So, either I devise a
>> way to get records into the product lots table without violating the
>> foreign key constraint that Postgres would apply. One way would be to
>> define the purchase_order_id field as an integer and handle the key
>> relationships through code. Not attractive.
>>
>> Another way would be to establish a third table for raw materials. This
>> would be a clone of the product_lots table but it would not have a foreign
>> key to purchase_orders. The purchase_order controller would then need to
>> create and update records in the raw materials table, while several
>> controllers in the production app would also create and update records in
>> the table as well. I don't like this solution much, either.
>>
>> Can anybody suggest another approach?
>>
>>
>>
>> On Thursday, April 19, 2012 1:03:41 PM UTC-4, nick name wrote:
>>>
>>> I don't understand what you are trying to achieve, but whatever it is,
>>> you are doing it wrong; your model should be:
>>>
>>> db.define_table('A', Field('name'))
>>>
>>> db.define_table('B', Field('name'), Field('id_from_table_a', 'reference
>>> A'))
>>> # alternatively:
>>> # db.define_table('B', Field('name'), Field('id_from_table_a', db.A))
>>>
>>> This would create the foreign key reference, and would allow nulls by
>>> default (which is what your condition does).
>>>
>>> But as I said, I'm not sure exactly what you are trying to achieve?
>>>
>>> On Wednesday, April 18, 2012 7:11:42 PM UTC-4, Cliff wrote:
>>>>
>>>> There are two tables, as follows:
>>>>
>>>> db.define_table('A', Field('name'))
>>>>
>>>> db.define_table('B', Field('name'), Field('id_from_table_a))
>>>>
>>>> Also there are two applications. One, called 'both_a_and_b', uses both
>>>> tables and uses 'table_a_id' as a foreign key in table B. The other,
>>>> called 'table_b_only' needs CRUD access to the information in table B, but
>>>> it is not able to supply a value for 'id_from_table_a.'
>>>>
>>>> I think because Postgres recognizes foreign key constraints,
>>>> 'table_b_only' will not be able to create records in table B.
>>>>
>>>> What Is the right solution?
>>>>
>>>> I can think of two. First, create a third table, C, for all the data
>>>> that 'table_b_only' needs. This table would not have the
>>>> 'id_from_table_a'
>>>> field. The other application would need to write also to this table
>>>> whenever it creates a record in table B.
>>>>
>>>> A second possibility might be to define table B this way:
>>>> db.define_table('B',
>>>> Field('name') ,
>>>> Field('id_from_table_a', requires= IS_EMPTY_OR(IS_IN_DB(db, 'A.id',
>>>> ...)))
>>>> )
>>>>
>>>> I would be grateful for any guidance,
>>>> Cliff Kachinske
>>>>
>>>