2010-12-22 14 views
11

Upsert(insertまたはif exists、then update)プロシージャがデータベースプログラミングで悪い習慣とみなされているかどうかを調べます。私はそれがどんな妥当性も持っているなら、SQLサーバで働きます。データベースのアップアップ - 良いか悪い練習ですか?

数ヶ月前に働いていた場所では、常駐DBの指導者は新しく書かれたdbコーディング標準(ほとんど私が同意した)でUpsertsを避けるべきだと述べました。

私は本当にこれについての論理的な理由を見ることはできませんし、自分自身が合理的に良いプログラミング実践を意識していると考えてください。私はそれらが直進的なデータ管理に役立ち、過剰なストアドプロシージャ番号を避けるのに役立つと思います。

これについての結論に至るのに役立ついくつかの洞察力/議論を探してください。

ありがとうございました。コメントに応答して

更新:私は、データベース内のドメインエンティティデータ表現の作成または更新された参照

特定の文脈。たとえば、データベース内の「Person」テーブルの表現として「Person」オブジェクトが存在するとします。私は単に、新しいPersonを作成するためのメカニズム、または既存のPersonを更新するためのメカニズムが必要です。ここでは、Upsertストアドプロシージャ、またはUpdate用とInsert用の2つの独立したストアドプロシージャを作成するオプションがあります。

anyonesビューの利点や欠点はありますか?

+0

Oracleの観点からは、代わりにMERGE文を使用します。 – DCookie

+0

MERGEもSQL Serverに存在します(2005+私は信じています) – RPM1984

答えて

11

主な問題は、キーとして選択されたものが複製されるため、新しいレコードを追加することが意図されているときに既存のレコードを上書きすることです。たとえば、ログイン名を言ってください。ログインが存在するので、ログインが重複しているというエラーを戻す必要があるときに更新します。

2番目の問題は、削除されたレコードを復活させることです。プロセス「A」がレコードを照会し、プロセス「B」がそれを削除し、プロセス「A」が変更を送信すると言う。削除しようとしたレコードは、削除された「A」に例外を戻すのではなく、データベースに戻ってきます。

+0

ありがとう、これは私の後ろだった - この種のコードが問題を引き起こす可能性のある2つの良い例。 – gb2d

1

話す内容によって異なります。データ?それはデータ操作プロセスによって決定されますか?私がORの更新を挿入する必要がある場合、私はそれを行う必要があります。それがスキーマ・オブジェクトに関するものであれば、同様です。

+1

確かに。ごくわずかな方法や実践はそれ自身では悪いですが、ここではコンテキストやビジネスロジックが非常に重要です。 – Piskvor

+0

私が参照する特定のコンテキストは、データベース内のドメインエンティティデータ表現の作成または更新です。たとえば、データベース内の「Person」テーブルの表現として「Person」オブジェクトが存在するとします。私は単に、新しいPersonを作成するためのメカニズム、または既存のPersonを更新するためのメカニズムが必要です。ここでは、Upsertストアドプロシージャ、またはUpdate用とInsert用の2つの独立したストアドプロシージャを作成するオプションがあります。 – gb2d

+0

かなりの場合、私は別のパラメータを使ってupsertメソッドを持っています。 – TomTom

7

私は意図的にプログラムするのが好きです。

私は何かを作成しています。その場合、エンティティがすでに存在する場合は、挿入が失敗する(複製する)ことを望みます。または、私が知っていることを知っているものを更新しています。その場合は、アップデートが失敗するようにしたい(実際には起こらない)。

upsert/mergeを使用すると、この種のファジーが発生します。私はやったのですか?私は部分的に成功しましたか?行の値の中には私のもの(挿入物からのもの)があり、そのうちのいくつかは前にそこにあったのですか?

これまで、Upsertsは役に立ちました(これが最初に実装された理由です)。それを禁止するのはちょっとばかりです。それは犯罪者がそれらを使って警察から逃げるために道路を禁止するようなものです。 upsertsが物事を行うための唯一の共鳴可能な方法であるケースは無数にあります。そして、システム間でデータの同期をとってきた人なら誰でもこれを知ることができます。

0

2つのプロセスの最初の例における異論 - 2番目のプロセスが同じキーを持つ新しいレコードを追加することによって削除されたレコードを「復活」するのは、設計が不適切であること、 「upsert」手続きが同一のキーを用いてレコードを書いたか、または2つの別個の手続きが挿入されたレコードを書いたかどうかにかかわらず、起こる。

同一のキーを避けなければならない場合、自動インクリメントのIDキーが挿入に使用されます。同一のキーを避ける必要がない場合は、「ファントム・ジョイン」を作成しないように、優れたデータベース設計を実装する必要があります。例えば、電気通信の世界では、電話番号はしばしば再利用され、「ユニークな」キーである。人#2は電話番号を「継承」する可能性があるので、プライマリキーにすることはできませんが、人#1の延滞した未払い請求書や通話履歴などを "継承"しないようにする必要があります。ユニークな識別子は任意の結合ロジックで使用され、不正なデータ連鎖を防止します。

関連する問題