Как работает ORM?
#architecture #orm
Существует извечный спор ORM или SQL-запросы в коде. Я предпочитаю не спорить, а использовать и то, и другое.
Начнем с определений. ORM (Object-Relational Mapping) – это слой между базой данных и приложением, который занимается созданием, обновлением, чтением и удалением записей в базе данных. ORM упрощает работу с базой данных генерируя запросы из кода. Для этого необходимо описать модели, т.е. структуры таблиц. #nodejs разработчики делают это или через схему, или через TypeScript декораторы. Примеры:
Модели используются для генерации запросов и правильной cериализации/деcериализации данных, т.е. мэпинга записей из БД в JS объекты.
Существует практика использования getter/setter в моделях. Например, на основание birthday можно сделать getter age. Если по этому полю необходимо будет строить запросы, то getter/setter не позволит это делать. В этом случае правильней будет сделать вычисляемое поле на уровне базы данных. В Postgres для этого используется Generated Columns.
#architecture #orm
Существует извечный спор ORM или SQL-запросы в коде. Я предпочитаю не спорить, а использовать и то, и другое.
Начнем с определений. ORM (Object-Relational Mapping) – это слой между базой данных и приложением, который занимается созданием, обновлением, чтением и удалением записей в базе данных. ORM упрощает работу с базой данных генерируя запросы из кода. Для этого необходимо описать модели, т.е. структуры таблиц. #nodejs разработчики делают это или через схему, или через TypeScript декораторы. Примеры:
// schema approachimport { Sequelize, DataTypes } from 'sequelize';class User extends Model {}User.init({ username: DataTypes.STRING, birthday: DataTypes.DATE});// decorator approachimport { Entity, Column } from 'typeorm';@Entity()class User { @Column() username: string; @Column('date') birthday: string;}Модели используются для генерации запросов и правильной cериализации/деcериализации данных, т.е. мэпинга записей из БД в JS объекты.
Существует практика использования getter/setter в моделях. Например, на основание birthday можно сделать getter age. Если по этому полю необходимо будет строить запросы, то getter/setter не позволит это делать. В этом случае правильней будет сделать вычисляемое поле на уровне базы данных. В Postgres для этого используется Generated Columns.