API の新しい機能を設計している最中で、ジレンマに遭遇しました。
1 対 N の関係を持つ 2 つの異なるタイプのリソースがあります。表現とレイヤー。表現には複数のレイヤーを含めることができます。Layer は 1 つの Representation にのみ属することができます。私たちが立ち往生しているのは、表現内のレイヤーの順序を維持する必要があるということです。
そして、次の 2 つのアプローチを考え出しました。
最初のアプローチ:リンクされたリスト
各レイヤーは、その前のレイヤーについて知っています。DB では、これは、別のレイヤーの ID を含むレイヤー テーブルに「親」フィールドを持つことによって実現されます。最初のレイヤーには、NULL に設定された「親」があります。
これは、次の URI によって API を介して公開されます。
作成
GET /Representations/{repID}/layers
表現のすべてのレイヤーを取得します。順序は、すべてのレイヤーを調べて、親フィールドを確認することで解決できます。
POST /Representations/{repID}/layers
本体: ラベル: (文字列) 親: LayerId
これは、要求本文で Parent を指定することにより、レイヤーを作成して特定の位置に挿入するために使用されます。Parent を NULL に設定すると、新しく作成されたレイヤーが順序の最初のレイヤーになります。親フィールドを省略した場合、新しく作成されたレイヤーは順序の一番下に配置されます。これに関する問題は、応答で、新しい挿入のために他のレイヤーの順序が変更されたことを API コンシューマーに通知する必要があることです。
アップデート
PUT /Representations/{repID}/layers/{layerId}
body: Label: (文字列) Parent: LayerId ここでも、新しい Parent を指定してレイヤーを並べ替えることができます。また、変更された他のすべてのレイヤーに関する情報を送り返す必要があります。
消去
DELETE /Representations/{repID}/layers/{layerId}
変更された他のすべてのレイヤーに関する情報を送り返す必要があります。
2 番目のアプローチ:レイヤーを独自のリソースとして注文する
アイデアは、レイヤー自体には順序の概念がないということです。それらは単なるリソースです。次に、レイヤーの順序に関する情報を保持するのを担当するlayerorderリソースを取得します。
したがって、レイヤーの CRUD 機能は引き続き使用できます: GET - POST - PUT - DELETE
ただし、順序について知りたい場合、または順序を変更したい場合は、次の uri を使用します。
/Representation/{repId}/layersorder
このリソースは 2 つの方法のみをサポートします
GET /Representations/{repID}/layersorder
この Representation 内のレイヤー ID の順序付きリストを取得します。
PUT /Representations/{repID}/layersorder
body: [] - 新しい順序のレイヤー ID の配列。レイヤーの順序を更新します。リクエストの本文として、レイヤー ID の配列を新しい順序で渡す必要があります。(例 [1,3,2,4,6,5] )
最初のアプローチに従って、レイヤーを追加または削除するたびに、別のリソースが更新されたことを API コンシューマーに通知する必要があります。変更によって影響を受けるレイヤーのリストであった最初のアプローチでは、このアプローチではレイヤーの新しい順序 (layerorder リソース) です。
意見や同様の状況の例、および問題をどのように解決したかを聞きたいです。
ありがとう。