CHD = compressed hard drive. Each sector is compressed using an open source zip algorithm, each and every one of all these sectors are stringed together in order on the HD into one PC file, with a TOC/header in the front so when the game needs the info in sector 51, mame knows that sector 51 starts at byte 12345. (This is needed because the different sectors compress to different sizes.)
BigCHD: See above.
SmallCHD: Some sectors in a hard drive might containt the same info (before and thus after compression). The idea behind smallCHD is, unlike the normal CHD, keep one and only one copy for each group of sectors that are the same, and have the TOC point to that one copy. This results in a smaller file, but can mix up the parts of an area of a HD to be stored in various parts of the file.
Example:
First two rows is the TOC, third row the sector number, forth row the data in that sector.
Normal CHD
abcdefghj
123456789
1 2 3 4 5 6 7 8 9
A B C A D A E E F
SmallCHD
abcdefghj
123141556
1 2 3 4 5 6
A b c d E f
The small'ed CHD removed two "extra" copies of secotrs containing the data "A" and one of "E". However, if part of the game originally read c-d-e in that order, the original HD and CHD would read sectors 3 4 5, but with the smallCHD, it now has to read 3 1 4, which might mess up caches and other stuff, thus slowing down the reading of the data.
There also was the whole arguement on what if the games changes one of the duplicate parts and not another (not going into that).
Then the person who designed the CHD "format" for mame desided SmallCHD wasn't good enough for mame, and made it so mame does not construct smallCHDs. However, AFAICT, mame can still read and use smallCHDs for playing. If you run into any problems with them, though, too bad since mame does not officially support them.
The consense I've read is: play with the full size CHD (aka bigCHD), but backup and distribute in smallCHD.