Unterschied zwischen HasOne und BelongsTo in Sequelize ORM
Ich entwickle eine sails.js app mit sequelize ORM. Ich bin ein wenig verwirrt, als wenn BelongsTo und HasOne verwendet werden müssen.
Die Dokumentation besagt, dass :
BelongsTo Verbände sind Vereine, wo die Fremdschlüssel für die
eins-zu-eins-Beziehung besteht, auf der source-Modell.HasOne Verbände sind Vereine, wo die Fremdschlüssel für die
eins-zu-eins-relation vorhanden ist, auf das Ziel-Modell.
Gibt es einen anderen Unterschied außer das der Ort, wo diese angegeben sind? Hat das Verhalten noch weiter zu sein die gleiche in beiden Fällen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist universelles problem.
Der wesentliche Unterschied liegt in der Semantik. Sie haben zu entscheiden, was ist die Beziehung (Einige dumme Beispiel):
Mann hat nur einen rechten arm. Rechte arm gehört zu einem Mann.
Sagen, es Umgekehrt sieht ein wenig seltsam:
Rechten arm hat ein Mann. Ein Mann gehört, um den rechten arm.
Können Sie der Mann ohne rechten arm. Aber allein Rechte arm ist unbrauchbar.
In sequelize wenn RightArm und Männer sind Modelle, kann es wie folgt aussieht:
Und als Sie feststellen, es gibt auch Unterschied in db-Tabelle Struktur:
BelongsTo der foreignKey auf die Quelle, wo hasOne wird fügen Sie auf dem Ziel - (Sequelize schafft neue Spalte 'ManId' in Tabelle 'RightArm' , aber nicht erstellen 'RightArmId' - Spalte im 'Man' - Tabelle).
Sehe ich keine Unterschiede.
Man.hasOne(RightArm);
oderRightArm.belongsTo(Man);
? Oder Sie beide?Man.hasOne(RightArm); RightArm.belongsTo(Man);
Weil Sie tun die gleiche Sache, die ist ein Fremdschlüssel zu RighArm.Ich Stimme mit Krzysztof Sztompka über den Unterschied zwischen:
Ich würde gerne Antworten Yangjun Wang's Frage:
Es ist wahr, dass die
Man.hasOne(RightArm);
- Beziehung und dieRightArm.belongsTo(Man);
man das gleiche tun - jeder dieser Beziehungen wird die foreign key -manId
zu denRightArm
Tabelle.Aus der Perspektive des physischen Datenbank-layer, diese Methoden das gleiche tun, und es macht keinen Unterschied für unsere Datenbank, die genaue Methode, die wir verwenden.
Also, was ist der Unterschied? Der wesentliche Unterschied liegt auf den ORM layer (in unserem Fall ist es Sequalize ORM, aber von der Logik unten gilt für Laravel ist Eloquent ORM oder sogar zu Ruby ' s Active Record ORM).
Mithilfe der
Man.hasOne(RightArm);
Verhältnis, wir werden in der Lage sein, die zum Auffüllen des MannesRightArm
mit derMan
Modell. Wenn dies genug für unsere Anwendung können wir aufhören, mit ihm und nicht hinzufügen, dieRightArm.belongsTo(Man);
Bezug auf dieRightArm
Modell.Aber was, wenn wir brauchen, um die
RightArm
's-Besitzer? Wir werden nicht in der Lage, dies zu tun mit derRightArm
Modell ohne Definition derRightArm.belongsTo(Man);
Bezug auf dieRightArm
Modell.Einem weiteren Beispiel werden die
User
und diePhone
Modelle. Definition derUser.hasOne(Phone)
Bezug, werden wir in der Lage, füllen Sie unserenUser
'sPhone
. Ohne Definition derPhone.belongsTo(User)
Verhältnis, wir sind nicht in der Lage füllen Sie unserenPhone
's Besitzer (z.B. unsereUser
). Wenn wir definieren diePhone.belongsTo(User)
Bezug, werden wir in der Lage unserePhone
's Besitzer.So, hier haben wir den Unterschied: wenn wir wollen, zu können, füllen die Daten aus beiden Modellen, die wir brauchen, um zu definieren, die Beziehungen (
hasOne
undbelongsTo
) auf beide. Wenn es ist genug für uns, um nur beispielsweiseUser
'sPhone
, aber nichtPhone
'sUser
können wir definieren nurUser.hasOne(Phone)
Bezug auf dieUser
Modell.Logik gilt für alle ORMs, die
hasOne
undbelongsTo
Beziehungen.Ich hoffe das klärt Ihr Verständnis.
belongsTo
bei beiden Modellen, oder es wird nicht funktionieren? Auch – wie Sie richtig zu definieren, Migrationen? Sollten wir fügen Sie einfach eine Spalte (z.B.user_id
) auf dem Telefon-Modell?