Im allgemeinen Situationen, wenn ein Unternehmen eine Beziehung zu einem anderen hat, ich Nest REST-Ressourcen auf diese Weise:REST API-Design für Unternehmen aus verschiedenen Bereichen, aber mit gemeinsamer Beziehung
POST /user/{userId}/accounts
Und es ist in Ordnung für Unternehmen aus dem gleiche Domain. Aber wenn es um Entitäten aus verschiedenen Domänen geht, ergibt das keinen Sinn. Zum Beispiel habe ich Buslinien (@Entity Line
) und Operatoren (@Entity Operator
). Jede Zeile hat einen Operator:
@ManyToOne
@JoinColumn(name = "operator_id")
private Operator operator;
so, wenn ich neue Buslinie erstellen müssen i Betreiber übergeben müssen.
Es gibt kein Problem, wenn ich Zeile mit neuen Operator erstellen muss, aber wenn ich nur auf Operator verweisen möchte, muss ich Operator_id irgendwie übergeben. Einige Ideen, wie dies zu handhaben:
1. Nest Linie in Operator
POST /operators/{operatorId}/lines {name: "15B", type: "BUS"}
Es ist OK aus technischer Sicht, aber ich möchte halten Operatoren und Linien getrennt, weil Linie nicht der Fall ist wirklich "gehören" (nisten) zum Operator.
2. Pass operatorId direkt
POST /lines {name: "15B", type: "BUS", operator: 12}
Es gibt einige Probleme mit dieser Sache. Es gibt einen Fall, wenn ich neue Linie mit neuem Operator erstellt werden soll, und die Abfrage wird wie folgt aussehen:
POST /lines {name: "15B", type: "BUS", operator: {name: "SuperBUS"}}
Und ich brauche beiden Situationen. Dies bringt zusätzliche Entität (Coz Original hat Operator operator
, nicht int operator
) und "magische" Logik, die entscheiden wird, ob ich Zeile mit neuen Operator oder alten erstellen möchte.
Gibt es Best Practices für den Umgang mit solchen Situationen?
Wenn es keine Relation anderes als ein Verein ist (Operator besitzen nicht die Linien), sollten Sie die Operator, erstellen und es dann neben irgendeine Art von ID mit Referenz, was technisch gesehen zu zwei HTTP-Anfragen führt. Siehe [DDD: Aggregate] (http://thepaulrayner.com/blog/aggregates-and-entities-in-domain-driven-design/). – cdelmas
Guter Punkt. Ich war so konzentriert darauf, dass es sich um eine Ein-Anruf-Operation handelte und verpasste die offensichtliche Lösung. – ovnia