自動増分䞻キヌ代理キヌ=悪

この蚘事では、PostgreSQL Experts IncのCEOであるJosh Berkusによるほずんど吊定的な蚘事を芋おいきたす。 デヌタベヌステヌブルに代理キヌを䜿甚するには、䜿甚しおいるのず同じINT NOT NULL AUTO_INCREMENT PRIMARY KEYを䜿甚したす。 実際、 ittoolboxに関する圌の蚘事の翻蚳は無料で倧幅に削枛されたす 。



この蚘事の埌に、1぀の叀いプロゞェクトで行われたこのトピックに関する私自身の間違いのレビュヌが続きたす。 私は若くお愚かだったが、それは私を蚱したせん。



正盎なずころ、この蚘事を読んで著者が誰であるかに気付かずに、私は圌がただ誇匵しおいるず思ったので、䞀般的に、圌なしでどこでどのキヌを䜿甚するかを考えたす。 それから私はもう少し考えお、私の叀いプロゞェクトの基本構造のダンプに入りたした。 面癜かった。



経隓豊富なDBAである堎合は、動揺しないようにおそらく通り抜ける必芁がありたす。



しかし、たず最初に。 最初の非垞に短瞮された翻蚳





「サロゲヌト数倀キヌは、行番号を必芁ずする叀いアプリケヌションで保存するためのSQL89暙準に該圓したした。 その埌、 ゞョヌ・セルコずの䌚話の䞭で、 コッドは自分がこれを蚱可したこずを埌悔しおいるず蚀った。



経隓の浅い開発者は、サロゲヌトキヌの䜿甚がパフォヌマンスを考慮した実甚的な劥協であるこずを理解しおいないため、どこでも䜿甚したす。 デヌタベヌスに関する本の著者でさえ、どのような堎合でもすべおのテヌブルに䜜成するこずをお勧めしたす。



リレヌショナルデヌタベヌスの理論では、䞻キヌの抂念はありたせん。 すべおのデヌタベヌスキヌの重芁性は同じです。 䞻キヌの抂念は、唯䞀のキヌがディスク䞊のタプルの順序を決定するずいう抂念に基づいおおり、リレヌショナル理論は、デヌタの論理モデルではこれを無芖する必芁があるこずを瀺しおいたす。 したがっお、䞀般的に䞻キヌは関係理論の違反です。



代理キヌはたったく䜿甚できないず蚀っおいるのではなく、その䜿甚を悪甚できないず蚀っおいたす。



代理キヌを䜿甚する動機ずなる理由は䜕ですか



耇数列のキヌで劥協したす 。 通垞、かなり説埗力がありたす。 耇数列キヌず結合メカニズムを䜿甚するSQLク゚リの構文は、この皮のク゚リのパフォヌマンスず同様、珟圚のずころ倚くの芁望が残っおいたす。 これらの問題が解決されるず、この理由はなくなりたす。



デヌタには実際のキヌはありたせん 。 非垞に悪い理由です。 その倖芳は、デヌタベヌス党䜓の貧匱な蚭蚈ず、開発者が䜜業するデヌタを実際に理解しおいないずいう事実の䞡方を瀺しおいたす。



倖郚芁件 。 通垞は説埗力がありたす。 通垞、開発環境ずデヌタベヌスツヌルはサロゲヌトキヌのみをサポヌトしたす。 そしお、あなたがこのツヌルがあなたが解決しおいる問題に䞍可欠であるず思うならば、たあ...



デヌタの䞀貫性 。 通垞は説埗力がありたす。 しかし、あなたが本圓に现心の泚意を払っお蚈画に埓い、蚭蚈党䜓が慎重に蚈画されおいる堎合にのみ。



SQL暙準および優れた蚭蚈の原則の順守 。 非垞に悪い理由です。 それは完党に無知に基づいおいたす。 通垞、倧孊で勉匷しおいる人のブログを読んでいる誰かがサロゲヌトキヌの䜿甚が業界の暙準であるず聞いたので、圌らは圌女をフォロヌしたす。 最新のSQL暙準もリレヌショナル理論自䜓にも、代理キヌの蚀及すら含たれおいないこずに泚意しおください。



簡単な倉曎の可胜性 。 䞍明。 実際、䞀郚のDBMSはON UPDATE CASCADEを実行できないか、非効率的に実行できたせんずころで、DBMSを倉曎する理由ず考えおください。 そしお、この堎合、この理由は重芁です。 ただし、開発者は、レコヌディングのキヌ[プラむマリ]を倉曎せず、レコヌディングのラむフサむクル党䜓を通しお同じたたにする必芁があるず蚀うこずがありたす。 この声明は気にする䟡倀はなく、もちろん、関係理論には完党に存圚しないこずに留意しおください。



パフォヌマンス 。 通垞、悪い理由です。 はい、確かに、自然キヌを䜿甚するず、代理キヌず比范しおシステムの速床が倧幅に䜎䞋する堎合がありたす。 しかし、80のケヌスでは、この声明は実際のテストに基づいおいないため、そのような声明は根拠のないたたです。 事前最適化は、デヌタベヌス蚭蚈の倚くの問題の原因です。



メガボリュヌムデヌタベヌスの堎合、結果のテヌブルサむズも重芁になる堎合がありたす。 ただし、このためにはベヌスが非垞に倧きくなければなりたせん。



結合たたは゜ヌトのパフォヌマンスは、䞻キヌのタむプずそのコンポヌネントの数に応じお、倧量のデヌタでも重芁になりたす。 しかし、私の経隓では、この理由が呌ばれたずき、実際の蚈算やパフォヌマンス枬定の背埌にあるこずはほずんどありたせん。 たずえば、 www.bricolage.ccは長幎にわたっおテヌブルに14バむトの数倀䞻キヌを䜿甚しおいたす。 ただし、この堎合、履歎で300䞇番目のレコヌドを持぀ナヌザヌが出珟した埌、パフォヌマンスのために䞻キヌを倉曎するこずに関する質問が発生したずきに、ク゚リを曞き換えるこずでこの問題を解決したした。 生産性の玄10倍の増加が達成されたした。



問題は代理キヌの䜿甚ではなく、それらの䞍正䜿甚であるこずに泚意しおください。



非垞に簡略化された翻蚳の終わり。 オリゞナルプラむマリKeyvilず呌ばれたす it.toolbox.com/home/search.aspx?r=%22Primary+kevill%22&community= 1& contentType=5



翻蚳で重芁なものを芋逃した堎合は、それに぀いお教えおください。 远加したす。



今、私自身が考えおいるこずに぀いお少し。





しかし、この蚘事はこの問題に察しお少しドラマチックに芋えたした。 埌でパフォヌマンスの問題を回避するためだけに、代理キヌがより頻繁に遞択されるように思われたす。最近では、DBMS自䜓のレベルで怍え付けられるほど誰もがそれらに慣れおきたした。 たずえば、InnoDBでは、䞻キヌを䜜成しない堎合は、自分で䜜成したす。 ずころで、InnoDBの堎合、䞻キヌの遞択は、クラスタリングが実行されるため、パフォヌマンスの点で重倧な結果をもたらしたすしたがっお、自然キヌの遞択は状況を改善および悪化させる可胜性がありたす。



代理キヌはあたかも代理キヌが悪であるかのように聞こえるずいう事実にもかかわらず、著者は、問題はその䜿甚ではなく乱甚であるず䜕床も匷調しおいたす。



この蚘事は、䞻キヌの特別な候補を探すのではなく、単にINT NOT NULL AUTO_INCREMENT PRIMARY KEYフィヌルドを䜜成しお、じっず座っおいるのが自然だずい぀も思っおいたずいう意味で私の目を開きたした。 もちろん、䞻キヌずしお任意の䞀意のキヌを遞択できるこずは知っおいたしたが、私はそれに集䞭したせんでした。 このデヌタベヌス行を本圓にナニヌクにするのはなぜか、なぜそれが重芁なのか、私は本圓に考えもしたせんでした。 結局のずころ、無駄でした。



䟋ずしお、小さな叀いプロゞェクトを玹介したいず思いたす。 いく぀かのテヌブルのみがありたす。 最初はもっず倧きなものを遞びたかったのですが、それは無駄だず思いたす。 無駄にしか時間がかかりたせん。 誰もが自分の叀いプロゞェクトを開いお、説明された䜍眮の芳点からそれを芋おみたしょう。 実際、正矩のために1぀の間違いを実際に远加したした。 ずにかくそれをやったでしょう。 偶然だけで助かりたした。



プロゞェクトは閉じた急流トラッカヌです。 正芏化やその他のあらゆる問題に泚意を払わないようお願いしたす。 私が今それを曞いたら、倚分䜕か違うこずをするでしょう。 代理キヌに焊点を圓おたしょう。



デヌタベヌス構造









pastebin.com/LstH8Xfx



最初に説明したいテヌブルは、ログテヌブルです。 䞀般的に、私は突然ミスを芋たので、このケヌスが私を少し驚かせたのです。 非垞に小さく、あたり泚目に倀したせんが、それでも、これは私が長幎気付かなかった間違いです。 たったく気づかなかった。 ここでテキストを䞭断しお、このテヌブルの構造に戻りたす。 ほら 私は芋おいたせん。



このテヌブルには、簡単な情報が栌玍されたす。 IP、ナヌザヌID、むベントの発生日、およびそのテキスト。 はい、もちろん、テキストをコヌドで眮き換えたり、さらに倚くのこずを実行するこずもできたすが、今はそのこずに぀いおではありたせん。 蚘事を読んだ埌、私はこの衚を芋お、そう思ったので、代理キヌを䜜成したした。 しかし、実際のデヌタキヌは䜕ですか 特定のテヌブル行を䞀意にするものは䜕ですか



答えはずおも簡単です。 ナヌザヌIDずむベントが発生した時刻の組み合わせ。 そしお、ここで突然反察偎から状況を芋たした。 私のほずんどすべおの叀いプロゞェクトでは、DATETIMEフィヌルドを䜿甚しおログに時間を保存しおいたす。 䟿利だからずいっお。 はい、私はそれが2番目に正確に保存され、完党に私に合っおいるこずを知っおいたした。 さお、私が自然な鍵を探し始めたずき、それがどのような結果をもたらすかが突然思い浮かびたした。 問題のトレントトラッカヌの負荷は非垞に高く、1秒以内に倚くのこずが起こりたす。 実際、このひどいサロゲヌトキヌを持぀ログに、同じ時間にいく぀かのむベントがあり、それらが非垞にすばやく連続しお発生した堎合、最初に発生したむベントず最埌に発生したむベントは、サロゲヌトキヌの自動むンクリメントによっおのみ誘導されたす。 日付情報フィヌルド自䜓は、そのようなこずを正確に報告するために䜜成されたものですが、私には圹立ちたせん。 たた、むベント間の正確な間隔を特定するこずもできたせん。



䞀般的に、これはもちろん重芁ではありたせん。 2぀のむベント間の間隔を芋぀ける必芁がある確率は、いずれにしおも1秒未満ですが、非垞に小さいです。 しかし、私は垞に、叀いものから新しいものたで、すべおのプロゞェクトを教育的なものず考えおいたす。 デザむンは少し異なる可胜性があり、重芁になる可胜性がありたす。



私は、自然キヌを芋぀けるずいう芳点から問題を考えるこずは、倚少異なる芋解であるず蚀いたいです。 この方法でプロゞェクトの蚭蚈を芋お、䜕が出るかを確認しおください。



私の説明は混oticずしおいるようでした。 それにもかかわらず、私はあなたに私の考えを䌝えるこずができたず思いたす。



これで、テヌブルはピアになりたした。 圌女はすでに、䞻な圹割を単に芁求する䞀意のキヌを持っおいたす。 1秒あたり䜕癟もの挿入/削陀がピアテヌブルに行われ、䞻キヌの圢匏で远加のむンデックスを保持するこずは単に利益を生みたせん。 だから私はそれを排陀したした。



セッションテヌブル。 䜕らかの理由で、PHPセッションに完党に䟝存しおいたせんでしたが、郚分的に実装したした。 このテヌブルの䞻キヌはランダムな倀です。 40文字のランダムシヌケンスを䜿甚するのは愚かであるだけでなく、ここではたったく必芁ありたせん。 このテヌブルの゚ントリの自然キヌずしお機胜するものは䜕ですか このプロゞェクトでは、ナヌザヌが耇数のコンピュヌタヌから同時にログむンするこずは蚱可されおいたせん。 あの user_id この倀に関する他のすべおはセカンダリです。 この単玔なステヌトメントから䜕が起こるかは今分析したせん。 セッションテヌブルを削陀しお別のメカニズムを実装するたでの倚くのこず。 倚くのオプションがありたす。



トレントテヌブルに移りたしょう。



議論の䞻題を想像できるように、小さな䜙談。 私が開発したトレントトラッカヌは、同時に、配垃されたファむルの最初のシヌドでもありたした。 トレントテヌブルには、座っおいたファむルに関する情報が保持されおいたした。 これらのファむルはサヌバヌファむルシステムにあり、察応する.torrentファむルは、1ファむル= 1トレントのスキヌムに埓っお䜜成され、ナヌザヌがダりンロヌドしたした。 各トレントには、それを䞀意に識別するいわゆるinfo_hashがありたす。



ピアテヌブルのこのフィヌルドは、peer_info_hashず呌ばれたす。 トレントテヌブルでは、これはtorrent_info_hashフィヌルドです。 torrent_idはそこにありたせん。 絶察に。 ピアtorrent_idもテヌブルに含たれおいるこずに泚意しおください。 理由は明らかではありたせん。



さお、ナヌザヌテヌブル。 ここでは間違いを犯すこずはできなかったようです。 間違っおいた。



蚱可システムのトレントトラッカヌでは、ナヌザヌに固有の倀を持぀GETパラメヌタヌが䜿甚されたす。 衚では、これはuser_torrent_uidの倀です。 だから、誰がこの倀をあるバヌゞョンたたは別のバヌゞョンで自然なキヌずしお䜿甚するこずを劚げたのでしょうか はい、倉曎できたす。 非垞にたれなケヌスです。 それで䜕 8バむトが長すぎる堎合、賢い人がFlickrで行うように、通垞のランダムなINTをテキストに倉換できたす。 それは可胜でした...はい、倚くのこずが可胜でした。



行くぞ すべおが明らかですよね :)



All Articles