What I use as best practice is:
- one domain per core;
- minimum of 1G of memory per domain;
Remember that what you boot (dom0) is also a domain, so it's good to leave a core to it, so on a quad core machine you may run 3 other domains without problems. Memory you can pretty much spread the rest as you want between then, or you may be interested in using the balloon driver to dynamically change memory sizes during use.
You can run more than one domain (VM) per core, but depending on what type of service you are running you may end having problems with that.
There's nothing much special about bandwidth resources unless you are running really network intense applications. Also, remember to not put IO intensive operations on VMs. If you really really have to do that, don't put two IO heavy VMs on the same host. For example: if you need to put a DB on a VM ok do it, but don't put two VMs on the same host running busy IO VMs or you will kill the performance of all VMs on your host.