GUID を主キーとして使用する場合の外部キーは「なし」または「未使用」

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

質問

私たちは、多くのサーバーに複製する必要があるかもしれないアプリケーションを構築しています (複製しないことを願っていますが、オンライン製品をリリースするまで、クライアントが独自のクライアント/サーバーのコピーを必要とするかどうかを知る方法はありません)。

サーバーの数が不明なため、トランザクション テーブル ID には GUID を使用することにしました。各クライアントには独自のデータベースがあるため、デフォルトの NEWSEQUENTIALID() を使用するつもりです。最大のテーブルでは年間 150 万行以下 (ただし平均 15,000 行) しか追加されません。パフォーマンス上の問題はあまり期待できません。 。

ただし、外部キーに「何も選択されていない」ことを示したい場合の処理​​方法がわかりません。たとえば、クライアントには 1 人の管理者ユーザーがいます。これは、login.id (GUID) への外部キー (login_id) として設定されます。しかし、クライアントにまだ管理者ユーザーがいない場合、「選択なし」キーを簡単に設定するにはどうすればよいでしょうか?

以前のアプリケーションでは IDENTITY 列を使用し、ほとんどのテーブルに ID 0 のダミー エントリを挿入しました。GUID を使用して同様の機能を提供するための受け入れられたアプローチはありますか?

役に立ちましたか?

解決

3 つのオプションがあります。

1) 参照テーブルに、すべてゼロの guid を持つ空の値の行を追加し、このレコードにリンクします。

2) 空の参照には null を格納するだけです

3) 参照テーブルに空のレコードを持たず、すべてゼロの GUID を保存します。これにより、データベース内またはレポートで結合が行われる場合に問題が発生する可能性があります。この特殊なケースに対応するコードを作成する必要があります。

良い選択肢は 1 と 2 だけだと思います。

他のヒント

これを行う唯一の安全な方法は、FK 値を NULL に設定することです。複数のサーバー間でデータをレプリケートする必要がある場合は、レプリケートする各テーブルに主キーとして GUID があることを確認してください。これにより、外部キー関係が問題になることはありません。

レプリケーションは次のように非常に簡単に機能します。最初に親テーブルから子テーブルへの順序で挿入と更新を複製し、その後、削除されたレコードを子テーブルから親テーブルに複製します。(逆の順序です。)

お役に立てれば。

ここで本当に明白な何かが欠けているかもしれませんが、NULL に設定することはできないでしょうか?

子テーブルの外部キー フィールドを NULL 可能にし、管理者ユーザーがいない場合はフィールドを NULL のままにします。ID 列「0」のような魔法の値は、大惨事の発生を待っています。

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