私の質問の最初の部分に関して: 私は最近、リレーショナル データベース内の特定のテーブルに一意の識別子を持つことの利点とトレードオフは何かを自問していました。例として、Facebook (FB) Graph API を使用すると、同じ URL を使用して「ユーザー」、「イベント」、「ページ」などのさまざまなタイプのオブジェクトをフェッチできます。たとえば、https://domain/251906384206はhttps://domain/195466193802264は「グループ」タイプのオブジェクトを返しますが、タイプ「イベント」のオブジェクト。
https://domain/event/251906384206またはhttps://domain/group/195466193802264のように使用される「一般的でない」API を提供する場合と比較して、このアプローチの利点は何ですか。この場合、各オブジェクト タイプには独自の識別子スコープがあるため、同様の識別子が異なるオブジェクト タイプに使用される可能性があります。
質問の 2 番目の部分について: グローバルに一意の識別子を実装するためのオプションは何ですか?
私の頭に浮かぶ2つのオプションは次のとおりです。
継承ベースのアプローチ (クラスごとのテーブル、単一テーブルなど) の使用。クラスごとのテーブル アプローチが使用されていると仮定すると (スーパー テーブルには一意の識別子が主キーとしてのみ含まれ、オブジェクト タイプを表すサブ テーブルにはスーパー テーブルと同じ識別子と追加のデータが含まれます)、スーパー テーブルとサブ テーブルの間に結合が必要であり、スケールが大きくないように見えます。スーパーテーブルがボトルネックになるから?
以下を含む 3 列のテーブルを提供する
- 一意の識別子、
- オブジェクト タイプ固有の主キー、および
- テーブル名。
一意の識別子を外部キーとして参照する列を含む、オブジェクト タイプごとの追加のテーブル。各オブジェクト タイプ固有のテーブルには、独自の主キー スコープがあります。
どちらのアプローチでも、前述の FB API のような汎用 API を提供できます。2 番目のアプローチでは、オブジェクト テーブル固有の主キーを内部で使用し、グローバルに一意の識別子のみを公開できます。ただし、グローバル一意識別子が内部で使用される可能性がある場合、2 番目の方法でも結合が必要になります。
グローバルに一意の識別子の長所と短所に関する経験はありますか?それを実装するためのベスト プラクティスは何ですか?