Right now they have the Newsletter by POst set as parent plans under each MAIN plan.
I don't understand. You can't have a parent of a parent. You mean they have each newsletter as a child plan of your parent plan? Something like the following?
Main Plan
- Newsletter Plan
- Newsletter Plan
- Newsletter Plan
1. Is this correct to do?
I don't see anything wrong with it. If the newsletters are free it's probably better to just use AcyMailing and its CB plugin so they can subscribe to newsletters using a tab/field instead of making CBSubs do it.
My question comes from when I trying to build a Fabrik list, as the old site had before. The customers come up as duplicates because the CBSUBs subscriptions table reads all the plans including the parent plan
Nothing to do with the usage or CBSubs table structure (which is correct and efficient) and everything to do with your query not being specific enough. The parent plan id is stored in the "parent_plan" column of _cbsubs_subscriptions. So anything with a "0" for "parent_plan" has no parent. To match "parent_plan" to its subscription row you'd just check against "plan_id" in your query.