It can be relatively simple if the final schedule has the "no pair at a table more than once" property that you discuss above. Then you can 1st decide who has the bye in each round, next assign the remaining players randomly to each table, now consider an algorithm that swaps pairs of players between two tables in the same round that improves a criterion measuring how frequently all pairs of players occur together at a table (minimize the sum of squares of the symmetric pairwise frequency table). So for each iteration make a swap that gives the best reduction in the criterion. When the frequency table contains entries that are all zero or one, then you have found an optimal schedule.
If there are n players, b of whom have a bye in each of r rounds. Then a necessary condition for the no pair more than once property to be met is:
3r <= n(n-1)/(n-b)
The closer the parameters n, b & r are to equality, the worse the algorithm above will perform and you would be well advised to have a library of schedules to cover these sorts of condions. You should be able to find quite a few of these on this forum.
When you are the other side of the inequality, some pairs of players sit together at a table more than once, which complicates matters as the number of times pairs of players appear as partners and as opponents has to be considered.
Hope that helps.