2017-01-05 11 views
1

Недавно я работал с Sequelize.js и довольно часто встречал термин «DAO». Исходя из использования ActiveRecord (в Rails), идея ORM кажется довольно прямой.DAO vs ORM - концепция объясняется в контексте Sequelize.js

Может ли кто-нибудь объяснить мне (желательно с некоторым контекстом, используя Javascript & Sequelize), что такое DAO? Чем он отличается от ORM? Как это приводит к более модульному коду/предотвращению утечки абстракции?

Edit: После прочтения вещи, как: https://www.reddit.com/r/learnprogramming/comments/32a1fr/what_is_the_general_difference_between_dao_and_orm/

Он чувствует/походит на DAO можно рассматривать как особую «модель» - как в контексте ActiveRecord, мой экземпляр пользователя будет считаться DAO в что он: «абстрагирует реализацию постоянного хранилища данных от приложения и позволяет простое взаимодействие с ним.«?

+0

«Необработанные запросы» - это [конкретный пример] (http://docs.sequelizejs.com/manual/tutorial/models-usage.html#raw-queries), в котором Sequelize.js упоминает 'DAO':'// Ожидаете ли вы массивный набор данных из БД, // и не хотите тратить время на создание DAO для каждой записи? // Вы можете передать дополнительный запрос для получения необработанных данных: Project.findAll ({где: {...}, raw: true}) ' –

ответ

4

Вот несколько мыслей, которые могут помочь вам в этом. Я больше знаком с ActiveRecord, чем Sequelize, поэтому я буду работать с этим, но концепции должны быть одинаковыми для обоих.

У вас есть база данных. Вы можете полностью не зависящий от Rails (например, с помощью инструмента администрирования базы данных), запустите и запустите запрос в этой базе данных - что-то вроде "select * from users limit 1". Но это просто дает вам набор результатов в каком-то окне администратора, которые не очень полезны для вашего приложения Rails. Вы хотите иметь возможность выполнять SQL из своего приложения Rails и получать данные обратно в форме, с которой Ruby/Rails может работать. Вам нужно Access вашего Data через какой-то рубин Object - вам нужно Data Access Object, или DAO.

В рельсам, можно выполнить запрос выше что-то вроде:

result = ActiveRecord::Base.connection.execute("select * from users limit 1") 

Переменная result не будет знать или заботиться о вашей User модели. Все это будет содержать, по существу, список равнины рубина Hash случаев, как:

{ 
    "id" => "1234", 
    "email" => "[email protected]", 
    "first_name" => "Fred", 
    "last_name" => "Flintstone", 
} 

Если вы хотите обновить first_name к Bob, вы можете не только редактировать этот хэш и вызвать экономить на нем - это просто простой старый хеш, только данные и никаких дополнительных умений. Таким образом, вы должны написать свой собственный SQL снова, и получить Rails выполнить это для вас:

ActiveRecord::Base.connection.execute("update users set first_name = 'Bob' where id = 1234") 

Так что вы используете в этом контексте в основном только рейл DAO, без использования его ORM.

ORM подобен слою на DAO. У вас может быть DAO без ORM, но у вас не может быть ORM без DAO. ORM, или Object Relational Mapper будет Map концепций/записей в вашей Relational базе данных с Objects на вашем языке программирования (т. Е. Ruby). Итак, если вы хотите, чтобы сделать вещи выше, используя рейл ORM, а не использовать его DAO, это может выглядеть следующим образом:

user = User.find(1234) 
user.name = 'Bob' 
user.save! 

Посмотрите, как гораздо лучше, она использует ОРМ?Теперь фрагмент выше, используя ORM, по существу будет просто выполнять тот же SQL, который мы подробно описали ранее. ORM просто абстрагирует больше деталей и предоставляет более интеллектуальные объекты, чтобы сэкономить нам кучу дополнительной работы.

Опять же, продемонстрированные концепции можно перенести в Sequelize/Javascript и другие langs/frameworks.

Так что DAO - это всего лишь «объект, который может выполнять SQL и возвращать результаты в некоторую базовую структуру данных, родную для языка программирования». В ORM в конечном итоге будет использоваться DAO для связи с базой данных, но он обеспечивает намного больше возможностей.

+0

Удивительный ответ. Помогли прояснить многое и подтвердили некоторые плавающие «подозрения» в моем сознании. Большое спасибо. –