tutorial sequelize node for belongstomany node.js orm sequelize.js

node.js - node - sequelize js find



Diferencia entre HasOne y BelongsTo en Sequelize ORM (2)

Estoy desarrollando una aplicación sequelize con sequelize ORM. Estoy un poco confundido en cuanto a cuándo deben usarse BelongsTo y HasOne.

La documentación establece que:

Las asociaciones de pertenencias son asociaciones donde existe la clave foránea para la relación uno a uno en el modelo de origen.

Las asociaciones HasOne son asociaciones donde existe la clave foránea para la relación uno a uno en el modelo de destino.

¿Hay alguna otra diferencia aparte del lugar donde se especifican? ¿Sigue siendo el comportamiento igual en ambos casos?


Este es un problema más universal.

La principal diferencia está en la semántica. tienes que decidir cuál es la relación (un ejemplo tonto):

El hombre tiene un solo brazo derecho. El brazo derecho pertenece a un hombre.

Decirlo a la inversa parece un poco raro:

El brazo derecho tiene un hombre. Un hombre pertenece al brazo derecho.

Puedes tener hombre sin brazo derecho. Pero solo el brazo derecho es inútil.

En la secuela, si RightArm y Men son modelos, puede verse como:

Man.hasOne(RightArm); RightArm.belongsTo(Man);

Y como se nota, también hay una diferencia en la estructura de la tabla db:

BelongsTo agregará el foreignKey en la fuente donde hasOne agregará en el destino (Sequelize crea la nueva columna ''ManId'' en la tabla ''RightArm'', pero no crea la columna ''RightArmId'' en la tabla ''Man'').

No veo más diferencias.


Estoy de acuerdo con sobre la diferencia entre:

Man.hasOne(RightArm); RightArm.belongsTo(Man);

Me gustaría responder a la pregunta de Yangjun Wang :

Entonces, en este caso, debería usar Man.hasOne(RightArm); o RightArm.belongsTo(Man); ? ¿O usarlos ambos?

Es cierto que el Man.hasOne(RightArm); relación y el RightArm.belongsTo(Man); uno hace lo mismo: cada una de estas relaciones agregará el manId clave manId a la tabla de RightArm .

Desde la perspectiva de la capa de base de datos física, estos métodos hacen lo mismo, y no hace ninguna diferencia para nuestra base de datos, qué método exacto usaremos.

Entonces, ¿cuál es la diferencia? La diferencia principal radica en la capa de ORM (en nuestro caso es sequelize ORM, pero la lógica siguiente se aplica a la ORM Eloquent de Laravel o incluso a la ORM de Active Record de Ruby).

Usando el Man.hasOne(RightArm); En relación con esto, podremos poblar el RightArm de hombre usando el modelo de Man . Si esto es suficiente para nuestra aplicación, podemos detenernos y no agregar el RightArm.belongsTo(Man); Relación con el modelo de RightArm .

¿Pero qué RightArm si necesitamos obtener el propietario de RightArm ? No podremos hacer esto usando el modelo de RightArm sin definir el RightArm.belongsTo(Man); Relación en el modelo de RightArm .

Un ejemplo más serán los modelos User y Phone . Al definir la relación User.hasOne(Phone) , podremos User.hasOne(Phone) nuestro User . Sin definir la relación Phone.belongsTo(User) , no podremos completar el propietario de nuestro Phone (por ejemplo, nuestro User ). Si definimos la relación Phone.belongsTo(User) , podremos obtener el propietario de nuestro Phone .

Entonces, aquí tenemos la principal diferencia: si queremos poder rellenar datos de ambos modelos, necesitamos definir las relaciones ( hasOne y belongsTo ) en ambos. Si es suficiente para nosotros solo obtener, por ejemplo, el Phone User , pero no el User Phone , podemos definir solo la relación User.hasOne(Phone) en el modelo del User .

La lógica anterior se aplica a todos los ORM que tienen relaciones hasOne y belongsTo .

Espero que esto aclare su comprensión.