The first consideration is whether to have a separate root aggregate or not. There have been some really good discussions on this community. Most of us agree that for a smaller system the edge case of why to have it doesn't make sense. Typically, you want 2 spares at minimum for maintenance garage (the ability to test a failed drive to see if transient or a real failure)..ONTAP is very proactive about drive health and will pre-fail a drive by copying it (saves time over a full raid rebuild), but depending on how many disks in the system you could go with 1 spare which can make sense if you need the additional usable from that drive.
The best practice is to have all even sized raid groups... so if you have 48 drives... you could go with 2 raid groups of 22 (20D+2P) and leave 4 spares for example (max for sata is 20, but an option to override to 22). There is also a consideration if you should keep both controllers symmetric with the same number of disks. On a system with 12 disks for example, that leaves 6 per controller and some find that going assymetric (9 on node1 and 3 on node2) can give better performance since it is spindle bound instead of CPU bound.
Please post the total drive count and drive size and you will get some recommendations...not all will be the same, but there are a lot of really sharp NetApp people on here and makes for a good discussion and options. From your initial post I likely would create one aggregate per controller using all even sized raid groups (or a single raid group) and get the most data drives possible in one aggregate. VMware and SQL workloads will be random and the more SATA spindles in the aggr the better.