デフォルトのデータベース ID。システムとユーザーの価値観

StackOverflow https://stackoverflow.com/questions/9702

  •  08-06-2019
  •  | 
  •  

質問

現在のデータベース作業の一環として、データベースの更新プロセスの処理を検討しています。

繰り返し取り上げられるポイントは、システムとシステムの問題を扱うことです。ユーザーの価値観。私たちのプロジェクトでは、ユーザーとシステムの値が一緒に保存されます。例えば...

テンプレートのリストがあります。

1, <system template>

2, <system template>

3, <system template>

これらはアプリ内で列挙型 (1、2、3) にマッピングされます。

その後、ユーザーがやって来て追加します...

4, <user template>

...そして...

5, <user template>

それから..アップグレードを発行します。アップグレード スクリプトの一部として挿入します...

<new id> [6], <new system template>

それから!!...新しいシステム テンプレートにバグが見つかったので、更新する必要があります...問題はどうやって?ID6 を使用してレコードを更新することはできません (ID6 を 9 または 999 として挿入した可能性があるため、他のメカニズムを使用してレコードを識別する必要があります)

そこで、これに対して考えられる解決策を 2 つ考えました。

赤コーナー(スピード)では……。

ユーザー ID を 5000 (またはその他の値) から開始し、データを 10000 (またはその他の値) でテストするだけです。これにより、システム値を変更し、次の ID 範囲の下限までテストできるようになります。

利点...実装が迅速かつ簡単、

不利益...十分に大きな範囲を選択しないと、値が不足する可能性があります。

青い隅(スケーラビリティ)...

システム データとユーザー データを別々に保存し、GUID を ID として使用し、ビューを使用して 2 つのリストを結合します。

利点...スケーラブル..DB サイズに関する制限はありません。

不利益..実装がより複雑になります。(多対一の更新可能なビューなど)


私は最初の選択肢を真剣に考えていますが、私をバックアップする弾薬を探しています。

これらのアプローチ、または私たちが見逃しているアプローチについて何か考えている人はいますか?

役に立ちましたか?

解決

私はデータベースの ID として GUID を使用する際に (パフォーマンスや開発 - TDD と単体テストを含む) 問題が発生したことはありません。また、いくつかのかなり大きな問題にも取り組んできました。見てください ここ, ここ そして ここ GUID (および関連する可能性のある GOTCHAS) を主キーとして使用する方法について詳しく知りたい場合は、データを安全に移動し、DB を同期することが朝の歯を磨くのと同じくらい簡単になるため、あまりお勧めできません。 -)

上記の質問については、テンプレートがユーザー ベースかシステム ベースかを示す 3 番目の列 (可能であれば) を推奨するか、少なくともシステム テンプレートを挿入するときにその GUID を生成してリストを保持することをお勧めします。これにより、テンプレートを更新する必要がある場合、他のテンプレートを上書きすることを心配することなく、DEV、UAT、および/または PRODUCTION データベース内の同じ GUID をターゲットにすることができます。ただし、3 番目の列は、すべてのシステム テンプレートまたはユーザー テンプレートを 2 つのテーブルに分ける必要がなく、自由に選択するのに便利です (これはやりすぎです)。

それが役立つことを願っています、

ロブ・G

他のヒント

システム値とユーザー値を 1 つのテーブルに保存するという変更を加えて 2 番目の値を使用することをお勧めします。このように、GUID は非常に信頼性が高くなります。

別のアイデア:任意のテキストベースの ID (GUID は必要ありません) を使用します。これはシステム値に指定し、ランダムな文字列またはユーザー値のある種のカスタム ロジックに基づいた文字列によって生成されます。

別のアイデア:最初のアプローチを使用しますが、値がシステムかユーザーかを示すフラグを使用してテーブルを拡張します。おそらくこれが最も簡単です。正しいシステム値を更新するには、何らかのメカニズムを作成する必要がありますが、それは簡単に行うことができます。

Biri のテキストベースの ID に +1 - 「template_mnemonic」テキストベースの列を定義し、それを主キーにします。これは、ユーザーが挿入するときに既知の値となり、開発者が決定 (または自動生成) し、ユーザーが指定したテンプレートの数に関係なく、ニーモニックによってテンプレートを常に参照できます。また、これにより、ユーザーはテンプレートに意味のある命名規則を付けることができます。

理解できなかったのかもしれませんが、GUID を ID として使用しながら、ユーザー データとシステム データを一緒に保持することはできないのでしょうか?これにより、(変更不可能な) GUID を使用してシステム データにアクセスできるようになります。

GUID が問題になるとは思いません。

これを回避したい場合は、フラグを使用します。

ID 整数

テンプレートは何でも

フラグ enum/int/bool

フラグは、実際の値がシステム値であるかユーザー値であるかを示します。

システム値を更新したい場合は、ID 順に並べられたシステム値のみを要求すると、実際の挿入順序が表示されます (ID がいっぱいにならないようにするには、ID に bigint などを用意する必要があります)。削除された ID は元に戻りません)。このリストでは x.記録は×です。挿入されたシステム値。

もっと良い3番目の解決策があると思います。同じテーブルに 2 つの異なるものを保存しているので、ユーザー テンプレート用とシステム テンプレート用に 2 つの別々のテーブルを作成した方がよいのではないかと思いました。その後、2 つのテーブルに対するビューを作成して、アプリケーションに対してそれらを 1 つのオブジェクトとして表示できる場合があります。明らかに、私はあなたのアプリケーションについて完全な知識を持っていませんし、これはさまざまな理由で不可能かもしれませんが、GUIDよりもきちんとした解決策であり、IDの範囲よりもはるかに安全だと思います(真剣にID範囲を使用しないでください。いつかあなたを噛む)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top