I will try to provide a possible solution following the suggestion by @a_horse_with_no_name to use a column type to describe the referenced column.  

The first part would be modeling `cost`, `price` and `shipping` using two columns each, one holding a column type and the other holding the actual value.
We can design the database like this:

    Discounts
    share    base_type    item_id
    ------------------------------------------
    50       C            3
    25       P            1
    100      S            2
    
    
    Items
    id    type_1    value_1    type_2    value_2    type_3    value_3
    -----------------------------------------------------------------
    1     C         10         P         40         S         20
    2     C         55         P         60         S         30
    3     C         50         P         85         S         10

The second part is to enforce the values of `type_1`, `type_2`, `type_3` with a constraint, either in the application logic or in the business logic (`ADD CONSTRAINT type_1 CHECK (type_1 IN ('C', 'P', 'S')` ecc…)