Sorry, had to get that out of the way.
The program right now is stand alone software so when it installs on your local machine and you change pricing it only effects your local copy. To take this web based I need to have pricing for every user.
To take it one layer further. The default values change every week but existing users pricing doesnt change. (New users get new pricing, old users update their own pricing) so I can't store only changed values but have to store all values of product price.
Let's try and break this down (table schemas bolded):
You have 0 - N customers so you have a table for that:
Customer, fields: CustomerId, CustomerName
You have 8000 products regardless of whether you have 0 customers or 1000 customers. This initial catalog has no customer association and is modeled as such:
CatalogProduct, fields: CatalogProductId, ProductName, DefaultPrice
you can now set and manage the default price for without affecting existing customer prices
When a customer joins you can use either an Insert trigger on the customer table or an insert/select as a second batch after the customer record insert that will add the default catalog at the default prices for the new customer. This junction table is modeled as such:
CustomerCatalog, fields: CustomerCatalogId, CustomerId (FK to customer table), CatalogProductId, CustomerPrice
the customer can now override your default price.
So if you have 8000, standard widgets as soon as the customer signs up they will immediately have those 8000 records associated with them, if they want to set their own price you can move data into the browser as necessary and update it (think editable paged lists.)
If the customer specific products need to exist in the CatalogProduct table then add an additional field to CatalogProduct called CustomerId, for your 8000 default products the CustomerId field will be null, and you can insert defaults by querying for those records with a null value, and new customers won't get other customer products inserted because the non null CustomerId value records will be filtered out.