This is a tricky process which has been revised multiple times.
- 2017 version - 2016 code apparently never really got finished, and the Items table needs some flag changes
- 2016 version - webified version of 2010, with rules finally documented
- 2010 version: see maint/build-cat.php
- 2009 version - SQL statements executed directly from PHP code
- 2008 version - started in 2007 - a set of stored queries called from a stored procedure
- 2006 version
It's interesting to note that I originally thought of SCM Groups as groups of Titles -- an explanation from the VbzCart/tables page on 2008-02-17 (and only removed on 2016-02-01) says:
The key concept here is "catalog title groups" (CTGs). A CTG is a set of titles which are all available with the same set of options (e.g. sizes) at the same prices (e.g. $10 S, $11 M-XL, $12 2XL). The final vbz catalog (cat_items) is the result of a sort of vector multiplication of Titles (cat_titles) and CTGs plus any items in stock.
This conceptualization no longer works, as a SCM Title may have one or more SCM Groups -- e.g. if it has a set of standard sizes (like S-3X) but is also available in super-large sizes (4X+).