Sequelize: what's the point of models? - node.js

I'm using Sequelize as my ORM, and just wondering what the point of having a model is.
It looks like the main thing that matters, is the table definitions in your migrations, and models are just a static snapshot of what your tables look like. When you perform a migration, nothing changes in your models. It doesn't get updated, nor created/deleted based on your migration.
You have to manually keep your models up to date it looks like.
So is there any point in having models, or making the effort to keep them updated?

The models are the definition of your database schema so that it can map into the ORM that Sequelize provides. For me this is the most important feature of Sequelize, not the migrations.
Migrations are used for changing the database schema.
Models are used to map the database schema to your code.
Using Models gives you lots of built in helper methods, associations let you build references between tables to generate complex JOINs, etc.

Related

How do I keep the code clean (independent) from the dependencies like Sequelize or any other ORM?

Here is an example:
I am creating a Family Tree application, where a user can create a new Family, add members, add relationships like couples, children/parent etc.
I am trying to use SOLID principles and keep Entities (Family, Member, Couple Relationship, Ancestry Relationship) independent of the ORM.
If I use Sequelize (mysql) today, but in future I wish to switch to Mongoos(mongodb). How do I inject the dependency so that migration in the future would take minimum changes?

How do you unit test JOIN queries in Sequelize?

I am using Sequelize to access a database from NodeJS. The database has a few tables with relationships, and I have a query that joins tables i.e. something like this
const result = await modelA.findAll({
...
include: [
{
model: modelB,
...
}
]
})
I have been struggling to find a good way to test this.
I have looked at
sequelize-mock
sequelize-test-helpers
None of which mention anything about testing associated Sequelize models.
I have tried to create mock models with sequelize-mock, and re-define the relationships between the models, but that also did not work so I am not sure if it is supported (by did not work I mean the above query I made did not actually do a join with the two provided mock models, despite the attempted association definition between them).
Alternatively, I could just mock the return value of findAll(, but I am aware that that return object is Sequelize implementation specific so it would be ideal if I could avoid constructing that object myself. Also I feel like that defeats the purpose of having the above mocking libraries as well.
Any one know a good way to approach this?

Mongoose: Schema vs Model?

When looking at tutorials there is often a delineation between a schema and a model, particularly when dealing with mongoose/mongodb.
This makes porting over to postgresql somewhat confusing, as 'models' don't seem to exist under that system. What is the difference the two approaches?
For example, what would be a postgres/sql ORM equivalent of this line?
(mongoose and express.js):
var userSchema = schema.define('local', {
username: String,
password: String,
});
module.exports = mongoose.model('User', userSchema);
In mongoose, a schema represents the structure of a particular document, either completely or just a portion of the document. It's a way to express expected properties and values as well as constraints and indexes. A model defines a programming interface for interacting with the database (read, insert, update, etc). So a schema answers "what will the data in this collection look like?" and a model provides functionality like "Are there any records matching this query?" or "Add a new document to the collection".
In straight RDBMS, the schema is implemented by DDL statements (create table, alter table, etc), whereas there's no direct concept of a model, just SQL statements that can do highly flexible queries (select statements) as well as basic insert, update, delete operations.
Another way to think of it is the nature of SQL allows you to define a "model" for each query by selecting only particular fields as well as joining records from related tables together.
In other ORM systems like Ruby on Rails, the schema is defined via ActiveRecord mechanisms and the model is the extra methods your Model subclass adds that define additional business logic.
A schema is fundamentally describing the data construct of a
document (in MongoDB collection). This schema defines the name of each item of data, and the type of data, whether it is a string, number, date, Boolean, and so on.
A model is a compiled version of the schema. One instance of the model will map to one document in the database.
It is the model that handles the reading, creating, updating, and deleting of documents.
A document in a Mongoose collection is a single instance of a model. So it makes sense that if we're going to work with our data then it will be through the model.
A single instance of a model (like a User instance in var User = mongoose.model('User', userSchema);) maps directly to a single document in the database.
With this 1:1 relationship, it is the model that handles all document interaction - creating, reading, saving, and deleting. This makes the model a very powerful tool.
Taken from "Mongoose for Application Development", by Simon Holmes, 2013
I imagine models as classes created from a schema (maybe I am mistaken).
MongoDB stores everything in BSON , which is a binary format. A simple Hello World BSON document might look like this internally:
\x16\x00\x00\x00\x02hello\x00\x06\x00\x00\x00world\x00\x00. A computer can deal with all that mumbo-jumbo, but that's hard to read for humans. We want something we can easily understand, which is why developers have created the concept of a database model. A model is a representation of a database record as a nice object in your programming language of choice. In this case, our models will be JavaScript objects. Models can serve as simple objects that store database values, but they often have things like data validation, extra methods, and more. As you’ll see, Mongoose has a lot
of those features.
Taken from "Express in Action", by Evan Hahn, 2016
In Short:
A Mongoose model is a wrapper on the Mongoose schema. A Mongoose schema defines the structure of the document, default values, validators, etc., whereas a Mongoose model provides an interface to the database for creating, querying, updating, deleting records, etc.
Reference: Introduction to Mongoose for MongoDB - FCC

Does mongoose ODM autoload schemas/models?

If I define a nested model or a relation in a mongoose schema, does it have a mechanism to autoload everything when re-hydrating instances, or do I simply have to ensure I've always loaded the appropriate models?
Nested, embedded model docs are auto-loaded, but if it's an ObjectId based relation, then you need to use Mongoose's populate support to explicitly load the related docs.
Mongoose performs all these actions based on the schemas and models that your code defines, typically during your app's startup.

Whats the difference between ORM and ORP?

What is the difference between Object Relational Mapping(ORM) and Object Relational Persistence(ORP)?
From what i know ORM is a framework for mapping relational tables to application domain objects and relationships between them. So in ORM you would already have a Persistent data structure?
ORP consists of:
Entities
Database connection
Database
Mapping (ORM)
Etc..
We could almost say it is the same thing since ORM is a term which is used as ORP. Both are used to indicate the same thing.

Resources