Are Foreign Keys Bad?

The Problem

Mike Simpson’s post on foreign keys raises some good points: http://www.slipjig.org/Mike/post/2007/11/Are-Foreign-Keys-Bad–You-Decide!.aspx. The main issue raised is how foreign keys cause deadlocks. In order to avoid deadlocks, you have to acquire locks on records in the same order, always. When you insert and update records related by foreign keys, you lock records from the parent tables to the child tables. To delete records, you lock records in the opposite order (child to parent tables) due to foreign key constraints, leading to potential deadlocks.

The Usual Solutions

There are three general approaches to deal with deadlocks:

  • Add retry code to handle deadlocks. Typically this is a lot of work and error prone — not to mention difficult to test. You generally don’t see many developers doing this due to the effort involved.
  • DELETE in the opposite order and allow deadlocks to occur. This isn’t as bad as it seems. It is common to have a little validation in the database layer — for instance for “The username must be unique” type validation. So you treat the deadlock like a validation error, report it to the user, and let the user hit the Save button again. Keep in mind that you may have a backend processes that can deadlock, which isn’t ideal — these backend processes don’t have to DELETE in order to deadlock. Even if it just has INSERTs and UPDATEs, it still can deadlock with a user who is DELETing in the opposite order (or more generally, locking in a different order).
  • “Logically delete” in the same order as INSERTs and UPDATEs to avoid deadlocks. Logical deletes are really updates where you set a field such as “IsDeleted” to true. The downside to this approach is all your SELECT statements have to filter out the “deleted” records, which could be error prone. The difference between this approach and the first approach though, is that this approach is much easier to test.

Don’t Use Foreign Keys!?!?

Mike proposes another idea — don’t use foreign keys! Mike’s good about coming up with ideas no one else thinks of, but in this case, is this going too far? Can you justify the tradeoff of data integrity for avoiding deadlocks? Personally, data integrity is more important. Despite this, I want to argue Mike’s side a bit more, b/c well, there are never hard and fast rules in software, like “you must always use foreign keys”.

Foreign keys causes additional locks that you may not be aware of — beyond dictating the order you modify records. Let’s say you have the following two tables: Player and Team. There is a foreign key from the Player table to the Team table. The Team table has the following records:

TeamID TeamName
1 Manchester United
2 Liverpool

The Player table has the following record:

PlayerID TeamID PlayerName
1 2 Gerrard

So Gerrard plays for Liverpool. Two impossible things are about to happen: a) Manchester United is going to be relegated (so we need to delete the team), and Gerrard is going to play for Manchester United.

User A executes the following statement:

BEGIN TRAN;

DELETE FROM Team WHERE TeamID = 1;

Internally in SQL Server, the table looks like:

TeamID TeamName
1 Manchester United marked to be deleted and locked
2 Liverpool  

When User B executes the following statement, it will block, b/c it is attempting to read Team 1 (Man U), but the record is locked and can’t be read.

BEGIN TRAN;

UPDATE Player SET TeamID = 1 WHERE PlayerID = 1;

The statement is blocked and waiting for the first user to commit the transaction. Foreign keys cause additional locks to be made. Not only that, but the locking goes from a child table to a parent table! This is in the opposite order we modify the records which can lead to deadlocks! (Even though the example above includes a DELETE on the team table, an UPDATE would lock exactly the same way in case you are thinking about doing logical deletes).

Mike’s post talks about a potential new feature in SQL Server where constraints are checked when the transaction is committed, not when individual records are modified, but is it really the answer? It will delay the foreign checking until the transaction is committed, but while it is checking the constraint, it will lock the records. This causes the locking for the whole transaction to be in random order, which will cause deadlocks.

SELECTs Lock Too!

Another thing on deadlocks, SELECTs lock records too! And therefore can deadlock. With joins, it’s anyone’s guess the order in which it locks records (parents first, or children first). As it turns out, most of the deadlocks I’ve seen have come from SELECT statements. The best way to avoid SELECT statements that lock in SQL Server 2005 is to use READ_COMMITTED_SNAPSHOT. To enable it, run the following code:

ALTER DATABASE MyDatabase
SET READ_COMMITTED_SNAPSHOT ON

It works very much like READ_COMMITTED, however without locking records. The downside is that READ_COMMITTED_SNAPSHOT uses more I/O than READ_COMMITTED.

Personal Preference

To avoid deadlocks I have a bias towards the following approach. After reading the above, you know there is no silver bullet, but this is a good balance of deadlock avoidance, data integrity, and ease of programming:

  • Use foreign keys
  • Do logical deletes
  • INSERT, UPDATE and Logically delete tables in the same order
  • Use READ_COMMITTED_SNAPSHOT isolation level.

About Clay Lenhart

I am a DBA/Technical Architect for Latitude Group and love technology.
This entry was posted in SQL Server Development. Bookmark the permalink.

17 Responses to Are Foreign Keys Bad?

  1. Mike Simpson says:

    Excellent post Clay! In defense of my proposing removing foreign key constraints, I did state that “To date I have not found it necessary to go to this extreme.” Generally I prefer the approach Clay described at the end of his post. But I thought this was a good topic of discussion – it’s not something many developers consider in much detail.

  2. Rajiv Narula says:

    Interesting post…

    Maybe you already know about this…
    eBay has developed an amazing architecture- where they have no foreign keys, no transactions.
    Yes, They work on auto commit

    Google on ebay architecture to read more on this

    Foreign keys and transactions – according to them- are major impediments on high scalable solutions.

    Anyways the fact an application like eBay has been able to pull it off- warrants credit
    .
    Cheers !!!

  3. 2015年の新素材-新作!高品質 腕時計高品質の追求 超N品を良心価格で提供詳しくは以下のようなブランドがあります。HERMES(バッグ、財布、時計) CHANEL(バッグ、財布、時計)LOUIS VUITTON(バッグ、小物、財布、時計) BVLGARI(財布、時計)Christian Dior(バッグ、財布) COACH(バッグ、財布)GUCCI(バッグ、財布) ROLEX(時計)OMEGA(時計) IWC(時計)FRANCK MULLER(時計) HUBLOT(時計)クロエ CHLOE バッグなどです。ご不明点が ございましたらお気軽にお問い合わせください
    ブランドコピー激安、ブランドコピー時計、ブランドコピー品当店のスーパーコピー商品は他店よりも質が高く、金額も安くなっております。ご購入する度、ご安心とご満足の届けることを旨にしておりますコピーブルガリ時計,コピーフランクミュラー時計,コピーシャネル時計, http://www.okakaku.com/brand-24-copy-0-cheap-0-max0-attr0-6-sort_order%20Desc%2cgoods_id-DESC.html

  4. 楽天ブランドコピーはボッテガヴェネタコピーのバッグのをご紹介します。ブランドコピー,商品の 代引き販売.2015春夏新作 BOTTEGA VENETA?ボッテガヴェネタコピー?財布 新品 ヴィンテージ ラムスキン 編み込み L字ファスナー 長財布こちらは業界一人気のボッテガ?ヴェネタスーパーコピー専門ショップです!5年間以上 のボッテガ?ヴェネタコピー品販売実績を持っている信用できるスーパーコピーボッテガ?ヴェネタ専門店!当店はボッテガヴェネタ 財布 コピー を激安で通販しているネット専門店です。ボッテガ ラウンドファスナー財布コピーやボッテガヴェネタ二つ折財布コピーなどを取り揃えてい ます。全商品はプロの目にも分からないボッテガ財布スーパーコピーN品です。 楽天ブランドコピーはボッテガヴェネタコピーのバッグのをご紹介します。ボッテガヴェネタ新作のスーパーコピーボッテガ?ヴェネタ商品満載。ブランドコピーボッテガヴェネタ商品は人気商品です。是非ご覧 ください。
    【新品】バッグ、財布、靴、帽子、アパレル、ベルト、その他小物 シャネル グッチ エルメス ロレックス ROLEX VUITTON CHANEL GUCCI HERMES ROLEX S級 VUITTON S級 CHANEL S GUCCI S級 HERMES S級 ROLEX AAA級 VUITTON AAA級 CHANEL AAA級 GUCCI AAA級 HERMES AAA級品 N級品ルイ ヴィトンS級品 シャネルS級品 グッチS級品 エルメスS級品 ロレックスS級品 ルイ ヴィトンAAA級品 シャネルAAA級品 グッチAAA級品 エルメスAAA級品 ロレックスAAA級品 ブランド バッグ 激安!! ブランド 財布 激安!! ブランド品を激安価格にて販売しております。 S級品 ブランド激安!! ブランド S級品激安!! AAA級 ブランド 激安!! ブランド 腕時計 激安!! S級品ブランド バッグ 激安!! S級品ブランド 財布 激安!! ルイヴィトンを激安で購入する方法 VUITTON財布を激安販売。 VUITTONバッグ 激安販売。 ヴィトン財布激安 S級ルイヴィトン財布 S級品ルイヴィトンバッグ ルイヴィトンバッグ激安!! ルイヴィトン財布激安!! ROLEX 腕時計激安!! CHANEL財布激安!! CHANELバッグ激安!! S級品 腕時計(Rolex)激安!! S級品 ブランド 腕時計 S級品ブランド 激安!! S級品ブランド 激安!!■スタイルが多い、品質がよい、価格が低い!■ 送料無料(日本全国) ご注文を期待しています!■信用第一、良い品質、低価格は■当社の商品は絶対の自信が御座います。激安、安心、安全にお届けします.品数豊富な商商品数も大幅に増え、品質も大自信です100%品質保証!満足保障!リピーター率100%! http://www.bagkakaku.com/hermes_bag.html

  5. Ross says:

    Wealth and reside charts Forex traders are glued to laptop or
    computer screens, watching a couple of minutes of charge is lost in the deep.

  6. snabblån says:

    I was excited to find this website. I wanted
    to thank you for ones time for this wonderful read!! I definitely really liked every part of it and I have
    you saved to fav to check out new information in your blog.

  7. ロレックススーパーコピー業界でアブラアム・ルイ・ブレゲ|【ブレゲ(1747年~1823年)】有名な時計メーカー「Breguet」の創設者で、天才時計職人とよばれた男。時計の歴史を200年早めた、と言われる。当時の彼の顧客には、ナポレオンやマリー・アントワネットなど超大物揃いだったとかユリス・ナルダン コピーブランド偽物、偽物ブランド、ルイヴィトンコピー、 ロレックスコピー、シャネルコピー、グッチコピー、エルメスコピー、 ボッテガヴェネタコピー、 バーバリーコピー、ミュウミュウコピー、トリーバーチコピー、バレンシアガコピー、ディオールコピー、ブルガリコピー、ブラダコピー、 ドルチェ&ガッバーナコピー、オメガコピー、フランク ミュラーコピー、gagaコピー。 靴/サンダル,サングラスコピー※ブレゲの発明には、衝撃を吸収する「パラシュート」、暗闇でも音で時を知らせる「ミニッツリピーター」、地球の重力による精度誤差を補正する「トゥールビヨン」など枚挙にいとまがない http://www.newkakaku.com/lq1.htm

  8. パテック・フィリップスーパーコピー当店設立以来、世界的に有名なブランドコピー品を扱っており、各商品の完成度が非常にいいです。鮮明な商品の写真、商品紹介および規格まで詳しく掲示しております。当店の商品は正規品に対して1:1の完成度で造られています。当店では信用第一を基に、出荷した商品に対して品質と確実にお届けできることを保障しています。ご注文頂いた場合、送料は当店でご負担させて頂きます。ぜひご利用頂き、買い物をお楽しみにしてください http://www.eevance.com/tokei/zenith

  9. もっと錦上に花を添えるの来場者は、また感じる「Rolex(ロレックス)愛の中国」というメッセージ、そして有事での証。まず、Rolex(ロレックス)が中国で多額の投資。ロレックスコピー次に、それと競争相手と同じで、積極的に賛助中国スター、彼らを招待ブランド。を含む世界ランキング第五の中国网坛名将李娜(2011年フランスオープン女子シングルス優勝、そしてここから1位になって、グランドスラム大会に優勝したアジア選手)、そのチームメイト郑洁(かつて摘みのグランドスラムダブルス)、中国の順位の第1のゴルファーの梁文冲や、国際上で高い名声を有し中国人ピアニスト王羽佳とユンディ・リ。 http://www.gginza.com/%E3%82%A2%E3%83%90%E3%82%A6%E3%83%88/item_13.html

  10. 最初のものは、エマニュエル・ブーシェの合併症の1つに不思議な三次元のダイヤルを除いて通知のうちの場合、サファイアクリスタル。後者はといえば、私はより多くの時計会社を使用したドーム型サファイア結晶のようなこのグレアの傾向ではないことを願います。 ブランドコピー時計 と同様に、このサファイア結晶に及ぼすarコーティングの他の通知をしなければ何か特定の形状と厚み。まだ具体的には、私はパネライ、あなたを思っています。 http://www.bestevance.com/rolex/day-date/index.htm

  11. 鋼のは今度の夏に利用可能であるべきと41 mmのステンレス鋼ケースを特徴とし、セラミックベゼルと内部のar処理によるドーム型サファイアクリスタル。彼らは、 シャネルバッグコピー 薄腕時計と日付にこのダイバー300は確かに本当によく見えますと、上記のケースのプロトタイプのように記述しています。計時御代田9015自動運動をhaliosサブ1000ドルの価格帯でしっかりと腕時計を生産し続けるのを許しますが管理している。 http://www.ooobrand.com/aq/index.html

  12. 出席者においても、有名ブランドの大使の三人だった。サッカーの伝説の画素é本だったと多くのカメラマンのレンズの焦点。でも、スーパーモデルのバー・ラファエリの印象的な美しさは70歳代のスーパースターから離れて注意をも驚かない彼女を優雅にして見て、プレス写真の大部分の彼女はどうにか、公式のチーズが新しい建物のためにカットをほおばりながらエレガントに見える)。この変わったと一緒に、ペアリングは素晴らしいが、ラポ・エルカン―男は生命とスタイルを設定する彼は、群衆から離れた。 http://www.fujisanbrand.com/

  13. 当店は業界最強の海外一番人気のルイヴィトン スーパーコピー 代引き販売老舗です!高品質のルイヴィトンコピー代引きや情報が満載しています。私達は貴方の為に同等な品質のルイヴィトン代引きと価格安い商品を提供します.ご購入する度、ご安心とご満足の届けることを旨にしております http://www.brandiwc.com/brand-super-14-copy-0.html

  14. ブランドスーパーコピーバッグ、財布、靴、時計【最大海外ブランド偽物販売激安人気店】最新作★シャネル コピー代引きルイヴィトン コピー,ルイヴィトン コピー代引き,ルイヴィトン スーパーコピー,ルイヴィトン スーパーコピー 代引き,ルイヴィトン 財布 コピー,ルイヴィトン 財布 コピー 代引き本店はブランド品のブランド財布コピー専門店です。開業以来低価格、高品質且つ豊富な品揃えで多くのお客様から支持と信頼を得ております。ブランド新品:Louis Vuitton(ルイヴィトン )Chanel(シャネル) Gucci(グッチ)芸能人愛用LOUIS VUITTON Twist Denim ルイヴィトンバッグDX67802ルイヴィトン2015春夏新作 新入荷 HERMES(エルメス) Rolex(ロレックス)最新モデルズラリ取り揃っております。信用第一、良い品質、低価格は 私達の勝ち残りの切札です。超格安価格で、安心、迅速、確実、にお客様の手元にお届け致します。ブランド品をより身近なものにし、誰でもブランド品を手に入れられるのは弊社の経営理念です。広大な客を歓迎して買います! http://www.ooobag.com/wallet/louisvuitton/index_6.html

  15. 私の知っている限り、まる四の違いと都铎都铎ゴースゴースの間(これは黒をかけるとフレームのバージョンでは、新作ブルー版)。第一個の区別は少し改正テキストの文字盤に、今四と二列に加え、都铎ビーチで運動はCOSC天文台の認証と腕時計のモデル名(「ビーチ」)。 http://www.ooowatch.com/tokei/chopard/index.html

  16. Piece of writing writing is also a excitement, if you be
    familiar with afterward you can write or else it is complex
    to write.

  17. There is noticeably a bundle to know about this. I assume you made certain good points in options also.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>