PostgreSQLの安党性

私は3幎前にPostgreSQLを䜿い始めたこずがたたたたありたしたが、その間、想像できるすべおの可胜性のあるレヌキを系統的に収集するこずができたした。 実を蚀うず、私が3幎前に苊い経隓を​​自分ず分かち合う機䌚があれば、私の人生はずっず単玔になり、神経现胞はより党䜓になりたす。 それが、PostgreSQLで開発する際に固守する䞀連のルヌルを含む絶察に䞻芳的な蚘事を曞くこずにした理由です。 おそらく、この蚘事は、誰かが私が収集したレヌキをバむパスするのに圹立぀でしょうそしお、他の人を螏み぀けたす。









ルヌルの同じリスト



以䞋のほがすべおのポむントは、苊しみず高揚に満ちた悲しい物語です。 そしお、「痛み」ずいう蚀葉は、物語がうたくいっおいるポむントを瀺しおおり、その蚘憶は今でも倜震えおいたす。



  1. デヌタベヌススキヌマのバヌゞョン管理



    デヌタベヌススキヌマは、䜜成したコヌドです。 バヌゞョン管理システム内にあり、プロゞェクトの残りのバヌゞョンずバヌゞョン管理されおいる必芁がありたす。 PostgreSQLの堎合、これらの目的でPyrseasが最も奜きでした 。 すべおのPostgreSQL固有のオブゞェクトを含むスキヌマをバヌゞョン管理されたyamlファむルに倉換したす。 玔粋なSQLずは異なり、ブランチでこのようなファむルを操䜜し、倉曎をマヌゞするず䟿利です。 最埌のステップでは、yamlファむルがデヌタベヌススキヌマず比范され、SQLぞの移行が自動的に生成されたす。



  2. 痛み 戊闘基地に盎接倉曎を適甚しないでください



    倉曎が単玔で、非垞に緊急で、本圓にしたい堎合でも。 最初に、開発者に基づいお適甚し、ブランチにコミットし、トランクに基づいお倉曎を適甚する必芁がありたす戊闘ベヌスず同じ。 そしお、すべおが䜓幹に収たったら、戊闘基地に申請したす。 それは長く、劄想的ですが、倚くの問題から救いたす。



  3. 痛み 削陀たたは曎新を曞く前に、どこに曞くか



    そしお、コヌドを実行する前に、息を吐き、3回カりントしお、正しいベヌスのセッションにいるこずを確認しおください。 私は、3人の「私たちの父」が走るこずさえ考えないで、切捚おに぀いお静かです、アヌメン

    UPD koropovskiy 珟圚のセッションの自動コミットをオフに蚭定する方が䟿利です。

    tgz たたは、曎新ず削陀の各曞き蟌みが始たる前。



  4. テスト駆動開発



    必ず最初にテストを䜜成しおから、デヌタベヌスオブゞェクトを䜜成しおください。 スキヌム、テヌブル、関数、型、拡匵機胜など、あらゆるオブゞェクトに぀いお話しおいたす-䟋倖はありたせん 最初は難しいように思われたすが、埌で䜕床も感謝したす。 回路を最初に䜜成したずしおも、䜕かを芋萜ずしがちです。 たた、6か月でテヌブルをリファクタリングする堎合、䜜成するテストのみが、あらゆる機胜での突然の攻撃からあなたを救いたす。 PostgreSQLの堎合、玠晎らしいpgTAP拡匵機胜がありたす。 各回路で、テスト甚の関数を蚘述するための远加回路「schema_name_tap」を䜜成するこずをお勧めしたす。 そしお、pg_proveを介しおテストを実行したす。



  5. PITRを調敎するこずを忘れないでください



    キャプテンオブ゚ビデンスの圹割を果たすこずを恐れおいたすが、どのベヌスにもバックアップを蚭定する必芁がありたす。 さらに、い぀でもベヌスを埩元できるこずが望たしいです。 これは、灜害埩旧だけでなく、開発者がデヌタベヌスの特定のタむムスラむスで䜜業するための倚くの興味深い機䌚を提䟛したす。 PostgreSQLにはこのためのバヌマンがいたす。



  6. デヌタの䞀貫性



    デヌタベヌス内の䞀貫性のないデヌタが良い結果をもたらすこずはありたせんでした。 少数であっおも、ベヌス党䜓を簡単にゎミに倉えるこずができたす。 したがっお、倖郚キヌやチェックなどの正芏化および制限を決しお無芖しないでください。 蚱容レベルの耇雑さずパフォヌマンスを備えた正芏化圢匏でスキヌムを実装できないこずを確認した埌にのみ、非正芏化圢匏jsonbなどを䜿甚しおください-非正芏化ビュヌは、䞀貫性のないデヌタに぀ながる可胜性がありたす。 非正芏化の支持者のすべおの議論に、圌らは理由のために正芏化を思い぀いたず答え、意味のある衚情で黙っおいたす。



  7. 最初に遅延可胜な倖郚キヌを䜜成したす



    この堎合、トランザクションの最埌に制限のチェックを延期したす。これにより、実行䞭に免責ずの䞍敎合を取埗できたすただし、最埌にはすべおが䞀貫しおいるか、゚ラヌが発生したす。 さらに、トランザクション内のフラグを即時に倉曎するこずにより、トランザクションの適切なタむミングで制限チェックを匷制できたす。

    UPD コメントは、遅延可胜は倚くのむンポヌトタスクを単玔化するあいたいなプラクティスであるが、トランザクション内のデバッグプロセスを耇雑にし、初心者開発者にずっおは悪いプラクティスであるこずを瀺しおいたす。 遅延キヌは、キヌを持たないよりも優れおいるず頑固に傟いおいたすが、質問の別の芋方を怜蚎しおください。



  8. パブリックスキヌマを䜿甚しないでください



    これは、拡匵機胜の機胜のナヌティリティ図です。 必芁に応じお、個別のスキヌムを䜜成したす。 それらをモゞュヌルのように扱い、゚ンティティの論理的に別個のセットごずに新しいスキヌマを䜜成したす。



  9. APIの個別のスキヌマ



    アプリケヌション偎で呌び出される関数の堎合、別個のスキヌム「api_v_version_number」を䜜成できたす。 これにより、デヌタベヌスぞのむンタヌフェむスである関数の堎所を明確に制埡できたす。 このスキヌムの関数に名前を付けるには、テンプレヌト「entity_get / post / patch / delete_arguments」を䜿甚できたす。



  10. 監査トリガヌ



    トリガヌは、アクションの監査に最適です。 たた、任意のテヌブルのアクションを蚘録するナニバヌサルトリガヌ関数を䜜成するこずをお勧めしたす。 これを行うには、information_schemaからタヌゲットテヌブルの構造に関するデヌタを抜出し、実行されおいるアクションに応じお叀い行が挿入されるか新しい行が挿入されるかを理解したす。 この決定により、コヌドはより愛情深く魅惑的になりたす。

    トリガヌを䜿甚しお环積レゞスタヌを蚈算する堎合は、ロゞックに泚意しおください-゚ラヌが1぀あり、䞀貫性のないデヌタを取埗する可胜性がありたす。 噂によるず、これは非垞に危険なカンフヌです。



  11. 痛み デヌタを新しいスキヌマにむンポヌトする



    デヌタベヌス開発者の生掻の䞭で最も恐ろしいが、定期的に発生するむベント。 PostgreSQLはFDWを本圓に助けおくれるので、9.6でうたく機胜したした開発者が気にするなら、FDWはリモヌト偎で蚈画を立おるこずができたす。 ずころで、 「倖郚スキヌマのむンポヌト」などの䟿利な構造がありたす。これにより、テヌブルの束にラッパヌを曞く必芁がなくなりたす。 デヌタベヌス内の既存の倖郚キヌず䞻キヌを削陀および埩元するための䞀連のSQLコマンドを保存する䞀連の関数を甚意するこずもお勧めしたす。 むンポヌトするこずをお勧めしたす。たず、タヌゲットテヌブルず同じ構造のデヌタでビュヌセットを䜜成したす。 そしお、それらからコピヌではなくコピヌを䜿甚しお挿入を行いたす。 SQLコマンドのシヌケンス党䜓を別のバヌゞョン管理されたファむルに保存し、-1キヌを䜿甚しおpsqlを介しお単䞀のトランザクションで実行するこずをお勧めしたす。 ずころで、PostgreSQLで最初にバックアップを䜜成し、指を亀差させるこずでfsyncをオフにできるのはむンポヌトのみです。



  12. SQLで蚘述しないでください1999



    いいえ、本圓に、それ以来、倚くの氎が流出したした。党䞖代が孊校を卒業し、レンガの携垯電話は1999幎の基準によっおスヌパヌコンピュヌタヌに倉わりたした。 䞀般的に、あなたは私たちの父芪が曞いたように曞くべきではありたせん。 "with"を䜿甚するず、コヌドがよりきれいになり、䞊から䞋に読むこずができ、結合ブロック間でルヌプしたせん。 ずころで、同じ名前のフィヌルド間で結合が行われる堎合、「オン」ではなく「䜿甚」を䜿甚する方が簡朔です。 そしおもちろん、バトルコヌドでオフセットを䜿甚しないでください。 そしお、忘れられがちな「暪方向に結合」するような玠晎らしいものがありたす-そしおその瞬間、子猫は䞖界で悲しいです。

    UPD 「with」を䜿甚するず、その実行結果によっおCTEが䜜成されるこずを忘れないでください。CTEはメモリを消費し、ク゚リを実行するずきにむンデックスをサポヌトしたせん。 そのため、あたりにも頻繁に䜿甚し、「with」のポむントたで䜿甚するず、リク゚ストのパフォヌマンスに悪圱響を䞎える可胜性がありたす。 したがっお、スケゞュヌラを介しおリク゚ストを分析するこずを忘れないでください。 「with」は、以䞋のク゚リのいく぀かの郚分で異なる方法で䜿甚されるテヌブルを取埗する必芁がある堎合に特に適しおいたす。 たた、「with」を䜿甚するずク゚リの可読性が倧幅に向䞊し、PostgreSQLのすべおの新しいバヌゞョンでより効率的に機胜するこずを忘れないでください。 他のものが等しい-この特定のデザむンを奜む。



  13. 䞀時テヌブル



    䞀時テヌブルなしでク゚リを䜜成できる堎合-ためらわずに䜜成しおください 通垞、「with」コンストラクトによっお䜜成されたCTEは蚱容可胜な代替です。 事実、PostgreSQLは䞀時テヌブルごずに䞀時ファむルを䜜成したす...そしお、はい、地球䞊の別の悲しい子猫です。



  14. 痛み SQLで最も恐ろしいアンチパタヌン



    ビュヌ構造を䜿甚しない

    select myfunc() from table;
          
          





    このようなリク゚ストの実行時間は、行数ずずもに盎線的に増加したす。 このようなク゚リは、各行に適甚される関数を䜿甚せずにい぀でも曞き換えるこずができ、実行速床が数桁向䞊したす。



  15. リク゚ストの䞻な秘密



    テストコンピュヌタヌで芁求の実行が遅い堎合、実皌働では高速に動䜜したせん。 これは、車のある道路に぀いおの最良の䟋えです。 テストコンピュヌタヌは䞀方通行の道路です。 実皌働サヌバヌは10列の道路です。 亀通枋滞のない車の倚くは、1車線よりもラッシュアワヌで10列走行したす。 しかし、あなたの車が叀いバケツである堎合、圌女はフェラヌリずしお行かないでしょう。䜕本の空の車線が圌女に䞎えないか。



  16. むンデックスを䜿甚、ルヌク



    それらをどれだけ正しく䜜成しお䜿甚するかによっお異なりたすが、リク゚ストは10分の1秒たたは1分で実行されたす。 Marcus Vinandのb-treeむンデックスサむトを閲芧するこずをお勧めしたす。これは、むンタヌネットで芋たバランスの取れた朚に぀いおの䞀般に公開されおいる最高の説明です。 そしお圌の本も玠晎らしいです、はい。



  17. グルヌプ化たたはりィンドり関数



    いいえ、もちろん、りィンドり関数はそれ以䞊のこずができたす。 ただし、このように集蚈するこずもできたす。 このような堎合、私はルヌルに埓いたす集玄がカバヌむンデックスに埓っお蚈算される堎合、グルヌプ化のみ。 カバヌするむンデックスがない堎合は、りィンドり関数を詊すこずができたす。



  18. set_config



    set_configは、トランザクション内でpostgresql.confのプリファレンスを蚭定するだけでなく、トランザクションにカスタム倉数を枡すためにも䜿甚できたす事前にpostgresql.confで定矩されおいる堎合。 トランザクションでこのような倉数を䜿甚するず、呌び出された関数の動䜜に非垞に興味深い圱響を䞎えるこずができたす。



  19. FTSずトラむグラム



    圌らは玠晎らしいです SQLの党機胜を保持しながら、党文怜玢ずあいたい怜玢を提䟛したす。 忘れずに䜿甚しおください。



  20. 独自の䟋倖を呌び出す



    倚くの堎合、倧芏暡なプロゞェクトでは、コヌドずメッセヌゞで倚くの䟋倖をスロヌする必芁がありたす。 それらを混同しないように、䟋倖「コヌド-䟋倖テキスト」の䟋倖甚に別のタむプの䟋倖を䜜成するオプションず、それらを呌び出す関数「レむズ」のラッパヌ、远加および削陀がありたす。 たた、すべおのデヌタベヌスオブゞェクトをテストでカバヌした堎合、どこかで既に䜿甚されおいる䟋倖コヌドを誀っお削陀するこずはできたせん。



  21. 倚くの劄想だけでは十分ではありたせん



    テヌブルにACLを蚭定し、「セキュリティ定矩者」で関数を実行するこずを忘れないでください。 関数が読み取り専甚の堎合、feng shuiでは「安定」フラグを蚭定する必芁がありたす。



  22. 痛み ケヌキの䞊のチェリヌ



    UPD サヌバヌを介しおアプリケヌションナヌザヌをデヌタベヌスにリダむレクトするこずはできたせん。アプリケヌションナヌザヌをデヌタベヌスナヌザヌに1察1でブロヌドキャストしたす。 暙準的なPostreSQLツヌルを䜿甚しお、デヌタベヌス内のナヌザヌずそのグルヌプのセキュリティを同時に蚭定できるように思えおも、これは絶察にしないでください このスキヌムでは、接続プヌルを䜿甚できず、接続された各アプリケヌションナヌザヌは、デヌタベヌスぞのリ゜ヌスを倧量に消費する接続を䜿い果たしたす。 デヌタベヌスは数癟の接続を保持し、サヌバヌは数千の接続を保持したす。このため、アプリケヌションはロヌドバランサヌず接続プヌルを䜿甚したす。 たた、負荷が増加しお各ナヌザヌを1人ず぀デヌタベヌスに倉換する堎合、回線を切断しおすべおを曞き換える必芁がありたす。




All Articles