Вы должны проектировать свой DAO в соответствии с потребностями вашего приложения, а не с макетом вашей базы данных. Начните с одного DAO, и если он станет слишком большим, переставьте его в несколько DAO таким образом, который имеет смысл для вашего кода.
Весь смысл DAO составляет скрыть любые концепции баз данных (например, таблицы) из вашего приложения. Ваше приложение должно просто просматривать его как услугу с помощью некоторых полезных методов.
Например, если вашему приложению нужны некоторые пользовательские данные, которые поступают как из таблицы Users, так и из таблицы EmailAddresses, вашему коду приложения не нужно координировать два DAO - он должен вызывать один метод DAO getUserDetails(), и DAO будет скрыть тот факт, что нужно вызвать несколько таблиц.
Я рекомендую первый из вариантов в вашем вопросе, но я бы не стал ограничивать правило «один DAO для класса контейнера».