問題タブ [primary-key-design]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - REST API 主キー設計 MySQL
私たちは新しい REST API を構築しており、主キーとべき等性キーに関していくつかの決定を下す必要があります。私たちの API には多くのユーザーがいて、ユーザーは自分に属するオブジェクトの検索のみが許可されています。userId
リクエストは認証されるため、特定のリクエストに関連付けられていることがわかります。
懸念される特性:
userId
ユーザーの ID。idempotenyKey
API へのべき等リクエストで使用されるべき等キー。ユーザーごとに一意です。
議論の基礎となるCars
エンドポイントを含む架空のテーブルがあるとします。GET .../cars/{id}
オプション
オプション 1 - userId と idempotencyKey の複合を主キーとして使用する
アイテム検索:
GET .../cars/{idempotencyKey}
考え:
- ルックアップで使用される ID は推測可能です。
- オブジェクトは認証されるため、これが差し迫ったセキュリティ上の懸念を引き起こすようには見えませんが、ユーザーのユーザーが何かを検索できるようにするエンドポイントが API に存在する場合は、検索が推測可能であると想定する必要があります。
オプション 2 - userId + idempotencyKey のハッシュを主キーとして使用する
挿入するときは、 を計算しid = hash(userId + idempotencyKey)
ます。
アイテム検索:
GET .../cars/{id}
考え:
- 主キーは推測できません。
- これにより、 に対する操作でのセキュリティ リスクの可能性がさらに防止されます
ids
。 - 複合主キーではなくなりました。
- オプション 3 とは異なり、(userId, idempotencyKey) に対する一意の制約は必要ありません。
オプション 3 - uuid 主キーの生成
挿入するときは、 を設定しid = UUID.randomUUID()
ます。
アイテム検索:
GET .../cars/{id}
考え:
- id は完全に推測不可能であり、ビジネス データに関連付けられていません。
- 追加のインデックスが必要です。
オプション 4 - ユーザーに公開されない、自動インクリメントされた主キー
ルックアップを行うにはいくつかの方法があります。ルックアップは、idempotencyKey のみに基づくことができます。つまり、次のようになります。
GET .../cars/{idempotencyKey}
または、参照 ID uuid を自動生成し、インデックスを作成してルックアップに使用することもできます。
考え:
- 主キーがユーザーに公開されることはありませんが、これはかなり一般的な方法です。
- ビジネス ロジックが変更された場合の柔軟性が向上します (ただし、userId や idempotencyKey などの基本的な概念については、これらがどのように変更されるかわかりません)。
- 主キーは INT であるため、より小さくなります。これにより、インデックスが小さくなり、おそらくパフォーマンスが向上します。
- ここでも追加のインデックスが必要です。
どのようなアプローチを取るべきかについてのアドバイスを探しています。パフォーマンスとスケールに関する考慮事項は非常に重要です。
ありがとう!
php - laravelのdelete()関数でエラーが発生するのはなぜですか?
テーブルに主キーがありません。userId と cartId を一緒に使用 したいです。
2列をプライマリとして定義する必要がありますか? どうやって?
sql - PostgreSQL でテーブルをロックせずに大きなテーブル (600 万レコード) に主キーを作成する
600 万レコードのテーブルに主キーを作成したいのですが、これを実行すると:
テーブルがロックされており、alter table の実行が終了しません...
python - SQL Server 重複行の削除とキーの管理
以下に示すように、2つのテーブルがあります。
トランザクション テーブルは、バイヤーとサプライヤー間の販売イベントを表すテーブルです。表の ... は、TransactionDate、ストア情報などの他の列を表します。
連絡先テーブルは、名前や自宅の住所など、バイヤーとサプライヤーの情報を表すテーブルです。
現在、2 つのテーブルは、BuyerID = ContactID および SellerID = ContactID という 1 対 1 の関係を共有しています。
このテーブルに Python スクリプトを入力しているので、答えは Python、SQL、またはその両方である可能性があります。
現在の状態
取引表
トランザクション ID (pk) | ... | バイヤーID | 販売者ID |
---|---|---|---|
11914 | 11914 バイヤー | 11914 売り手 | |
11915 | 11915 バイヤー | 11915 売り手 | |
11916 | 11916 バイヤー | 11916 売り手 |
連絡表
連絡先 ID (pk) | ... | ファーストネーム | 苗字 |
---|---|---|---|
11914 バイヤー | マイク | ドウ | |
11914 売り手 | ジャネット | マイヤーズ | |
11915 バイヤー | ジャネット | マイヤーズ | |
11915 売り手 | マイク | ドウ | |
11916 バイヤー | デイブ | ダーク | |
11916 売り手 | ジャネット | マイヤーズ |
私がしたいのは、連絡先テーブルの繰り返し行を削除し、テーブルの関係を 1 対多にすることです。さらに、たとえば Janet Myers が姓を変更した場合、他のすべての列が同じままであっても、Contact テーブルに新たに追加されます。つまり、ContactID 列を無視すると、ContactTable に 2 つの同一の行があってはなりません。
将来の状態
取引表
トランザクション ID (pk) | ... | バイヤーID | 販売者ID |
---|---|---|---|
11914 | 06dfe636-4408-4abe-b902-b1ac6aab9849 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | |
11915 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | 06dfe636-4408-4abe-b902-b1ac6aab9849 | |
11916 | ab99de1f-a714-4709-9a1e-f3a143b279d2 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d |
連絡表
連絡先 ID (pk) | ... | ファーストネーム | 苗字 |
---|---|---|---|
06dfe636-4408-4abe-b902-b1ac6aab9849 | マイク | ドウ | |
58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | ジャネット | マイヤーズ | |
ab99de1f-a714-4709-9a1e-f3a143b279d2 | デイブ | ダーク |
これを解決するために最初に考えたのは、他のすべての列のハッシュから ContactID を作成することです。
次にMERGE
、ContactID ハッシュがまだテーブルに存在しない場合は、ステートメントを使用して連絡先を追加します。これはうまくいくと思いますが、財務データとのハッシュ衝突の危険を冒すことを考え直しています。
ハッシュ以外に、私の他の考えはMERGE
ステートメントですが、ON
句に約 15 の列があるため、パフォーマンスが非常に低いと思いました。