REST仕様(どのレベルを使用する場合でも)は、データベースアクセスとして設計されていません。APIアクセスの標準化を試みています。前述のSQL規則(使用するかどうか)は、APIアクセスを考慮して設計されていません。SQLクエリを作成するためのものです。
したがって、ここで展開する問題は、APIがデータベースに直接マップされるという概念的な理解です。これは、少なくとも2009年まではアンチパターンとして説明されています。
これが悪い主な理由は?「この操作が私のデータにどのように影響するか」を説明するコード クライアントコードになります。
これはAPIにかなりひどい影響を与えます。(完全なリストではありません)
APIとの統合が困難になる
次のように文書化された新しいユーザーを作成する手順を想像します。
POST /users { .. }
POST /usersettings { .. }
いくつかのデフォルト値で
POST /confirmemails { .. }
しかし、ステップ2の失敗をどのように処理しますか?この同じ処理ロジックは、APIの他のクライアントに何回コピー/ペーストされますか?
これらのデータ操作は、多くの場合、サーバー側でシーケンスするのが簡単ですが、クライアントから単一の操作として開始されます。例POST /newusersetup
。DBAはこれをストアドプロシージャとして認識する場合がありますが、API操作はデータベース以外にも影響する場合があります。
APIの保護は絶望のブラックホールになります
2つのユーザーアカウントをマージする必要があるとしましょう。
GET /users/1
PUT /users/2 { .. }
DELETE /users/1
ユーザーの削除を許可せずに、マージ機能を許可するユーザー権限をどのように設定しますか?ユーザーの削除は、DELETE /users/1
いつ/usersettings
存在するかによってもかなり表されていますか?
API操作は、システムに複数の変更を引き起こす可能性のある、より高い(データベースよりも高い)レベルの操作と見なす必要があります。
メンテナンスが難しくなります
...クライアントがデータベース構造に依存しているためです。
このシナリオでの私の経験に基づいて:
- 既存のテーブル/列の名前変更または削除はできません。機能の名前が間違っていたり、使用されなくなった場合でも。クライアントは壊れます。
- 新しい機能は既存のデータ構造を変更できないため、そのデータと機能は、既存の機能に全体的に属している場合でも、人為的に分離されることがよくあります。
- コードベースは、断片化、わかりにくい名前、安全に削除できない残りの荷物のために、徐々に理解しにくくなります。
- 些細な変更を除き、すべてがますますリスクを伴い、時間がかかります。
- システムは停滞し、最終的に交換されます。
データベース構造をクライアントに直接公開しないでください。特に、開発上の制御権がないクライアント。APIを使用して、クライアントを有効な操作のみに絞り込みます。
したがって、APIをデータベースへの単なるインターフェイスとして使用している場合、複数形化は最も心配になりません。使い捨て実験以外の場合は、APIが表す必要がある高レベルの操作を決定するのに時間をかけることをお勧めします。そして、そのように見ると、複数形のAPIエンティティ名と単一のSQLエンティティ名の間に矛盾はありません。彼らはさまざまな理由でそこにいます。