This is a synthesis of various discussions and should be considered a rough draft. If anything has been left out, please mention in the comments and I'll update the post. When it's solid, I'll drop it in the docs and get to work.
Drupal Commerce (hereafter DC) defines a new Drupal entity type called "Product." This entity includes a default title, SKU, and price (to be replaced by a price Field) along with general Drupal meta data (uid, created / updated timestamps, and status).
DC allows users to define any number of "Product types" that include the base product entity and any additional Fields necessary to define products of that type. (Consider the way the node system works, in that you can have as many node types as you want, each having its own set of Fields.) DC comes with a "Basic product" product type that is simply the product entity with no additional Fields.
Fields should be added to product types to define attributes of the product. DC maintains a single product -> unique SKU relationship and abandons the idea of multiple SKU variations on single products that existed in Ubercart. In other words, whereas in Ubercart you might define a single product with a base SKU that was altered based on a customer's attribute option selection, with DC you would instead define every variation of that product up front as a unique product using any number of Fields to define the specific attribute options assigned to each SKU.
Products may be displayed to customers through "Product reference" Fields attached to nodes (or any other fieldable entity). Product reference fields can reference single or multiple products. This Field will come with an "Add to Cart form" formatter that generates an Add to Cart form based on the selected products. When multiple products are referenced, the Add to Cart form will automatically create the appropriate form elements needed for the user to choose one of the products to add to the cart.
Example: A site selling t-shirts of multiple sizes should define a "T-shirt" product type. Attached to this product type would be a text Field that includes options for every possible size. The store owner would then create a new T-shirt product for every size of every style t-shirt he wants to sell, each having a unique SKU. (We can certainly provide simplified UIs for accelerated product entry.) If the t-shirts were to be displayed for sale, he would create a "T-shirt display" node type that included a product reference field with the Add to Cart form display. Then for each style t-shirt, he would add a title and description and reference the various sizes of that style via the product reference field. When that node is viewed, DC will display the various products in an Add to Cart form with a select list (or some other widget) for the customer to specify which product should be added to the cart.
- Ryan's blog post