2017-01-07 5 views
-2

削除された行の主キー値を再利用する主キー索引の設計を検討しています(最も極端な場合は数秒以内です)。この場合、これが最も効率的な設計です。プライマリキーの値を再利用するのが安全ではありませんか?

ただし、バグやセキュリティ上の欠陥の可能性があります。クライアントは削除されたレコードの古いキー値を引き続き持つことがあります。そのキーに対する要求は、別のユーザーと同じユーザーが所有する行を返すことがあります。アプリケーションがどれくらいうまく書かれているかに応じて、混乱が続く可能性があります。

これは決してセキュリティ上の欠陥ではありません。アプリケーションが他のユーザーが所有する行へのアクセスを許可する場合、アプリケーションはいかなる状況下でも間違っています。しかし、これは欠陥をより目に見えるようにするか、悪用しやすくします。大きな問題は、行が同じユーザーに属している可能性があり、アプリケーションが予期しない動作をする可能性があるということです。これは、クライアントが考える行ではないからです。

削除後に主キーの値が再利用されたときに増分される再利用カウンタを行に追加することで、1バイトのコストで少し軽減できます。私は主キーのその部分を作るでしょう。再利用カウンタが一致すると、誤って行にアクセスすることができました。256回の再利用で1回だけです。バグはまだ可能で、ユーザーが行にアクセスする必要がある場合は適切なチェックの代わりにはなりませんが、間違った行に誤ってアクセスすると、少なくともそれは敗北します。

思考?

これは一般的なSQLデータベースではなく、カスタムデータベース用ですが、原則は直交しています。

+7

なぜプライマリキーを再使用して問題が発生する可能性があることを知っているのですか?ちょうど別の値を割り当ててください。整数を使用している場合、世界にはたくさんの整数があります。あなたはおそらく何らかの「圧縮」を望んでいますが、それは時期尚早の最適化を示唆しています。 –

+1

主キーの目的は、レコードを一意に識別することです。あなたが鍵を再利用するとすぐに、あなたは前提全体を破壊しました。代わりにナチュラルキーの使用を検討することもできます。 – PhillipXT

+0

メモリを節約し、はるかに効率的です。これは時期尚早の最適化ではありません。特定のテーブルにとって非常に重要な場合には、再利用されないセカンダリ・キーを常に追加することができますが、一般的なケースでは、再利用カウンタによって十分なものになると思います。 – Eloff

答えて

2

アプリケーションが別のユーザーが所有する行へのアクセスを許可する場合、アプリケーションはどのような状況でも正しくありません。

これは逆さまです。情報の提供者は、誰が情報を見ることができるかを決定します。 の猫(1)ではなく、ファイルのパーミッションと同じように、誰がそれを読むことができるかを決定するので、オブジェクトのDBMSパーミッションで誰がそれを読むことができるかが決まります。同じ表の異なるユーザーが互いの行を表示しないようにするには、ユーザーIDごとに行をフィルターするビューを用意します。

この行は、同じユーザーに属している可能性があり、アプリケーションが予期しない動作をする可能性があります。これは、クライアントが考える行ではないからです。

その中であなたの質問への答えをある:識別子を識別した場合、それは間違ったことを識別することはできません。クライアントがと考えているのは、の問題ではありません。データベースの内容はとなっています。

2つのことを表すために1つの識別子を使用しないでください。異なる時間に同じものであっても、ユーザーがそれらを同じものとして認識するならば、それは問題ありません。しかし、効率性やプログラミングの利便性のために識別子を共有する2つの異なるものであれば、ユーザーは何が何であるかについて誤解を招きます。そしてそれは公正ではない、あなたは知っていますか?ユーザーは、データベースからの誤った指示なしに物事を正しく取得するのに十分な問題があります。

あなたの識別子が一度だけ識別されるようにしてください。あなたの状況にその原則を適用した場合、その答えはすぐに明らかです。

+0

ジェームズありがとう、説得力のある答えだと私はあなたのポイントを参照してください。 IDが再利用されないように主キーを変更します。それはより多くのメモリを要し、彼らはもはやjavascriptの数字に収まらないことを意味するが、あなたの議論を考慮すると、それは価値があるようだ。 – Eloff

関連する問題