Należy zaprojektować DAO zgodnie z potrzebami aplikacji, a nie z układem bazy danych. Rozpocznij z jednym DAO, a jeśli stanie się zbyt duży, wtedy zreorganizuj go na wiele DAO w sposób, który ma sens dla twojego kodu.
Cały punkt DAO jest ukryć wszelkie pojęcia bazy danych (np. Tabele) z aplikacji. Twoja aplikacja powinna po prostu wyświetlać ją jako usługę przy użyciu pewnych użytecznych metod.
Na przykład, jeśli twoja aplikacja potrzebuje pewnych danych użytkownika, które pochodzą zarówno z tabeli Użytkownicy, jak i tabeli Adresy e-mail, twój kod aplikacji nie powinien koordynować dwóch DAO - powinien wywoływać jedną metodę DAO getUserDetails(), a DAO będzie ukryć fakt, że należy wywołać wiele tabel.
Polecam pierwszą z opcji w pytaniu, ale nie ograniczę się do zasady "jeden DAO na klasę kontenera".