È necessario progettare il DAO in base alle esigenze dell'applicazione e non al layout del database. Inizia con un DAO, e se diventa troppo grande, quindi rifattalo in più DAO in un modo che ha senso per il tuo codice.
L'intero punto di un DAO è nasconde qualsiasi concetto di database (come tabelle) dall'applicazione. La tua applicazione dovrebbe semplicemente vederlo come un servizio con alcuni metodi utili.
Ad esempio, se l'applicazione richiede alcuni dati utente provenienti sia dalla tabella Users sia dalla tabella EmailAddresses, il codice dell'applicazione non deve coordinare due DAO: deve chiamare un metodo DAO getUserDetails() e DAO nascondere il fatto che è necessario chiamare più tabelle.
Sto raccomandando la prima delle opzioni nella domanda, ma non mi limiterò alla regola "una DAO per classe contenitore".