目次
何が良いのかわからない
最初の CRUD アプリケーションを決して忘れることはありません
初めての検索システムも決して忘れることはありません
私が学んだアルゴリズム
は本当に非常に重要です
パフォーマンスも重要です
システムを書くのは複雑だと思いますか?
プログラミング スキルを向上させたい開発者にアドバイスが 1 つあるとしたら、それはデータベース開発チームに参加することです。データベース開発のおかげで、私のプログラミング スキルは大幅に向上しました。素晴らしいコーディング体験でした。
ホームページ バックエンド開発 Golang Go rqlite の作者は、データベース ソフトウェアを開発する際にアルゴリズムがいかに重要であるかを語ります。

Go rqlite の作者は、データベース ソフトウェアを開発する際にアルゴリズムがいかに重要であるかを語ります。

Jan 22, 2022 am 09:19 AM
go golang

この記事は、golang チュートリアルコラム「Go rqlite作者が教えるデータベースソフト開発でアルゴリズムがいかに重要か!」について紹介したものです。 》, 困っている友達の役に立てば幸いです!

データベース プログラムを書くのは魅力的な仕事です。私は過去 2 年間、オープンソース データベースの開発に深く関わってきましたが、データベース プログラミングは、おそらくソフトウェア開発者として行うことができる最も刺激的なプロジェクトです。

しかし、本当に衝撃的なのは、データベースに対する私の態度が過去 6 年間でどれほど変わったかということです。最初は興味がなかったのですが、今ではデータベース システムがソフトウェア エンジニアリングの最高峰であると考えるようになりました。

何が良いのかわからない

私のキャリアのほとんどにおいて、データベースに関する唯一の経験はデータベースについて読んだことだけでした。通常は退屈な文脈で、データベースに関する学部の教科書を開けば、私の言いたいことがわかるでしょう。通常、リレーショナル データベースの典型的な使用例として、次の表が表示されます。

#ID FIRST LAST TITLE 部門
1 ロバート ケリー ディレクター マーケティング
2 トム バーク 代表 営業
3 ジョン #スミス 副社長 セールス

もっとつまらないものを読んでもいいですか?これらがすべてデータベースに関するものであれば、私はそれらとは一切関わりたくありません。ポイントは何ですか?ソフトウェアはこれよりもはるかに優れていますよね?そのため、私は長い間、データベースとの関わりを完全に避けてきました。

最初の CRUD アプリケーションを決して忘れることはありません

2009 年、組み込みソフトウェア、Linux デバイス ドライバー、およびネットワーク ソフトウェアを何年も書いた後、気がつくと、Web ベースのシステムを構築する必要があるチームを率いていました。ご存知のとおり、AWS クラウドが登場し、クラウドベースのライセンス テクノロジーの MAC アドレスは無効になりました。私のチームは、新しい EC2 ベースのソフトウェア アプライアンス用のライセンス ポータルを構築する必要があります。私たちは Python の経験が豊富だったので、MySQL 上で実行される Django を選択しました。実際にデータベースに取り組み始めました。

CRUD アプリケーションが我が国の平原で実行され続けるにつれて、データベースがいかに重要であるか、そしてそれがシステムの中心であることに気づき始めました。データベースを失ってしまったら、ソフトウェア開発は無駄になってしまいます。データベースのデータが破損すると、お客様のデバイスのライセンスが失われ、ネットワークが機能しなくなる可能性があります。データベースが適切に機能しない場合、数千人が同時に影響を受けることになります。しかし、これらのことは何も起こりませんでした。データベース常に動作します。それは私たちを決して失望させません。私が感銘を受けた。
その後、外部キー制約、一意制約、参照整合性、インデックスなどを発見しました (覚えておいてください、現時点ではこれらのことについては何も知りません)。データベースは、より堅牢なシステムを構築するためのさまざまな方法で役立ちます。最近のデータベースは 素晴らしい - データベースは世界で最も退屈なものです 実際にシステムを構築する必要があるまでは

初めての検索システムも決して忘れることはありません

2012 年までに、私は大規模なインデックス作成および検索システムに基づいて、elasticsearch を使用した大規模なキーと値のデータベースを構築するチームを率いていました。芯。 Elasticsearch のようなシステム (世界クラスのインデックス作成に基づいて構築されたテクノロジ) が、たとえテラバイト規模のログ データであっても何ができるかを見るのは目を見張るものがあります。
これまで、データベースや検索システムでさえ失敗するのを見てきましたが、私はデータベース テクノロジーに魅了されています。 2014 年までに、私は [オープンソース時系列データベース] (github.com/influxdata/influxdb) のコアを開発する小規模な専任チームに加わりました。

私が学んだアルゴリズム

は本当に非常に重要です

Big O 分析が実際に活きるのは、データベース開発においてのみです。データベースは、プログラマーが数百万ものオブジェクトをループ、並べ替え、フィルター処理する必要がある数少ないアプリケーションの 1 つです。ここは、CS クラスで学んだ退屈な内容が重要視される数少ない場所の 1 つです。

これは、他の多くのソフトウェア開発には当てはまりません。ブートROMファームウェアを書き込んでいますか?いいえ、私にとってアルゴリズムは決して重要ではありませんでした。チューナーのデバイスドライバー? いいえ、それは問題ではありません。ネットワークデバイス管理ソフトウェア?CRUDアプリケーション?これらの分野のすべてが異なるスキルや知識を必要とすることはほとんどありません。ほとんどの場合、私はインタビューでランタイムの複雑さについて話しただけでした。
しかし、データベースの発展により、この状況はすべて変わりました。システムが正しい結果を返すのを実際に見るのは素晴らしいことですが、それはアルゴリズムの変更によるほんの一部の時間だけであり、それが自分のコードや構築したシステムで起こるのを見ることは素晴らしいことです。

パフォーマンスも重要です

ソフトウェアに関する古い話に次のようなものがあります。プログラマーは、以前のバージョンより 10 倍速く実行されるコードを作成しました。それを見せたのですが、出てきたデータが正しいデータと少し違うと誰かが指摘しました。 「しかし、それは 10 倍高速です」とプログラマーは指摘しました。 「そうですね、正確である必要がないのであれば、まったくスペースを取らず、無限に高速に実行できるバージョンを作成できます」と別のユーザーが答えました。
この道徳の話は常に私に大きな影響を与えてきました。正しいことは常に他の何よりも重要です。これは本物です。しかし、それはまた、プロジェクトが正しい結果を生み出すという理由だけでプロジェクトに価値があると私に信じさせるものでもあります。

データベースの場合、これは当てはまりません。
パフォーマンスは単なる機能ではありません。これは要件です。データベースに喜んでお金を払う人は、多くの場合、大量のデータを所有しているためにそうします。この状況でデータベースのパフォーマンスが良くない場合、つまり結果が迅速かつ効率的に返されない場合、データベースはまったく機能しない可能性があります。

システムを書くのは複雑だと思いますか?

データベース開発に関して私が最もショックを受けたのは、クエリ エンジンがいかに複雑になったかだと思います。私は、データをディスクに書き込んで保存するシステムを構築した経験が豊富です。これらのシステムを適切に機能させることは、大きな課題となる可能性があります。
しかし、この複雑さは通常、クエリ エンジンの複雑さよりもはるかに小さいです。柔軟なクエリ システム (質問が何になるかわからない場合に質問に答えるシステムを効果的に構築する) には、真剣な設計思考が必要です。クエリ プランナーは有効である必要があります。クエリ システムは、特定のディメンションによるフィルタリング、他のディメンションによるグループ化、異なるテーブルからのデータの結合など、多くの直交要件をサポートする必要があり、場合によっては外部ソースからのデータもサポートする必要があります。最後に、クエリ システム は効率的であり、良好なパフォーマンスを発揮する必要があります。これにより、設計と実装における抽象化と最適化の間に緊張が生じ、これを適切に管理するには真のスキルが必要になります。

現実の世界では、運用する必要があります

重要なデータベースは、バックアップ、リカバリ、断片化管理、監視などの基本的な操作をサポートする必要があります。

真面目なオペレーターである私がデータベースをバックアップできない場合、単純なことですが、データベースを使用することはできません。データベースが書き込みを受け入れる速度は関係ありません。クエリ中は、メモリ フットプリントがどれほど小さいかは関係ありません。データベースの作成者であるあなたの制御を超えた障害からデータベース内のデータを保護できなければ、データベースを快適に実行することはできません。
もちろん、データベースの協力を必要とせずにデータベースをバックアップする方法はたくさんあります。ただし、通常は組み込みメソッドが最適です。これは、rqlite v2.0 に対する私の推奨事項でもありますが、誰かに rqlite を真剣に使ってもらいたいのであれば、システムが完全に障害を起こし、データに長時間遅れてしまう可能性がある現実の問題を解決する必要があります。

したがって、データベースを設計および実装する場合は、最初から運用サポートを構築します。それをデザインの基本的な部分にしてください。ユーザーはあなたに感謝するでしょう。

答えは通常、「状況による」です。

特にオペレーターとして、初めてデータベースの操作を開始するときは、次のような質問をすることがあります。「システムはどのようなインデックスを評価できるでしょうか?」クエリに対する応答はどれくらい早くなりますか?どれくらいのディスク容量が必要ですか?どれくらいの大きさの破片でもまだ機能するのでしょうか?どうすれば高速化できますか?すべて予約なしで尋ねられました。以前は自分で作っていました。

データベース プログラマーに相談して、次のような質問をしてみてはいかがでしょうか。そして、あなたがしばしば、おそらくはこれからも得られる答えは次のとおりです。
それはあなた次第です。ベンチマークを行い、測定する必要があります。これを聞くとイライラするかもしれませんし、責任を回避しているように見えるかもしれません。 しかし、それは真実ではありません。

今、このような質問を聞くと、私は笑ってしまいます。ナイーブすぎる。

インデックス作成率は、ドキュメントやデータ ポイントの数だけでなく、データのサイズにも依存する場合があります。これは、バッチ処理、データのカーディナリティ、データベースがクラスタ化されているかどうか、データ内のどの列とフィールドにインデックスが付けられているか、新しいデータか既存データの更新か、データベースが実行されているマシンによって異なります。 RAM、IO パフォーマンス、および使用されるレプリケーション。
パフォーマンスを制御する変数には終わりがありません。
クエリの場合、時系列データの時間範囲に依存する場合があります。これは、ヒットしたレコードの数、クエリされたフィールドの数、範囲スキャンが含まれるかどうか、データにインデックスが作成されているかどうか、使用されるインデックスの種類、アクセスできるシャードの数、およびデータがローカルかどうかによって異なります。そして機械の特性。在庫はありますか?メンテナンス中ですか?ネットワークが混雑していますか?

したがって、答えは常に、

それは状況によります

です。データベース設計者は正直です。彼らは自分が構築したシステムについてすべてを知っていますが、あなたの質問に対する答えはまだ知りません。 プログラミング バケット リスト

プログラミング スキルを向上させたい開発者にアドバイスが 1 つあるとしたら、それはデータベース開発チームに参加することです。データベース開発のおかげで、私のプログラミング スキルは大幅に向上しました。素晴らしいコーディング体験でした。

元のアドレス: https://www.philipotoole.com/what-i-learned-from-programming-a-database/

翻訳アドレス: https://learnku .com/go/t/64605

以上がGo rqlite の作者は、データベース ソフトウェアを開発する際にアルゴリズムがいかに重要であるかを語ります。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Jun 06, 2024 am 11:21 AM

Go データベース接続の接続プーリングを構成するにはどうすればよいですか?データベース接続を作成するには、database/sql パッケージの DB タイプを使用します。同時接続の最大数を制御するには、MaxOpenConns を設定します。アイドル状態の接続の最大数を設定するには、ConnMaxLifetime を設定します。

Golang 単体テストのアサーションに gomega を使用するにはどうすればよいですか? Golang 単体テストのアサーションに gomega を使用するにはどうすればよいですか? Jun 05, 2024 pm 10:48 PM

Golang 単体テストでアサーションに Gomega を使用する方法 Golang 単体テストでは、Gomega は、開発者がテスト結果を簡単に検証できるように、豊富なアサーション メソッドを提供する人気のある強力なアサーション ライブラリです。 Gomegagoget-agithub.com/onsi/gomega をインストールする アサーションに Gomega を使用する アサーションに Gomega を使用する一般的な例をいくつか示します。 1. 等価アサーション import "github.com/onsi/gomega" funcTest_MyFunction(t*testing.T){

Golang フレームワークと Go フレームワーク: 内部アーキテクチャと外部機能の比較 Golang フレームワークと Go フレームワーク: 内部アーキテクチャと外部機能の比較 Jun 06, 2024 pm 12:37 PM

GoLang フレームワークと Go フレームワークの違いは、内部アーキテクチャと外部機能に反映されています。 GoLang フレームワークは Go 標準ライブラリに基づいてその機能を拡張していますが、Go フレームワークは特定の目的を達成するための独立したライブラリで構成されています。 GoLang フレームワークはより柔軟であり、Go フレームワークは使いやすいです。 GoLang フレームワークはパフォーマンスの点でわずかに優れており、Go フレームワークはよりスケーラブルです。ケース: gin-gonic (Go フレームワーク) は REST API の構築に使用され、Echo (GoLang フレームワーク) は Web アプリケーションの構築に使用されます。

GolangでJSONデータをデータベースに保存するにはどうすればよいですか? GolangでJSONデータをデータベースに保存するにはどうすればよいですか? Jun 06, 2024 am 11:24 AM

JSON データは、gjson ライブラリまたは json.Unmarshal 関数を使用して MySQL データベースに保存できます。 gjson ライブラリは、JSON フィールドを解析するための便利なメソッドを提供します。json.Unmarshal 関数には、JSON データをアンマーシャリングするためのターゲット型ポインターが必要です。どちらの方法でも、SQL ステートメントを準備し、データをデータベースに永続化するために挿入操作を実行する必要があります。

Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Jun 05, 2024 pm 10:39 PM

ベスト プラクティス: 明確に定義されたエラー タイプ (エラー パッケージ) を使用してカスタム エラーを作成する 詳細を提供する エラーを適切にログに記録する エラーを正しく伝播し、非表示または抑制しないようにする コンテキストを追加するために必要に応じてエラーをラップする

Golang の正規表現に一致する最初の部分文字列を見つけるにはどうすればよいですか? Golang の正規表現に一致する最初の部分文字列を見つけるにはどうすればよいですか? Jun 06, 2024 am 10:51 AM

FindStringSubmatch 関数は、正規表現に一致する最初の部分文字列を検索します。この関数は、最初の要素が一致した文字列全体で、後続の要素が個々の部分文字列である、一致する部分文字列を含むスライスを返します。コード例: regexp.FindStringSubmatch(text,pattern) は、一致する部分文字列のスライスを返します。実際のケース: 電子メール アドレスのドメイン名を照合するために使用できます。たとえば、email:="user@example.com", pattern:=@([^\s]+)$ を使用してドメイン名を照合します。 [1]。

golang フレームワークでよくあるセキュリティ問題を解決するにはどうすればよいですか? golang フレームワークでよくあるセキュリティ問題を解決するにはどうすればよいですか? Jun 05, 2024 pm 10:38 PM

Go フレームワークで一般的なセキュリティ問題に対処する方法 Web 開発で Go フレームワークが広く採用されているため、そのセキュリティを確保することが重要です。以下は、一般的なセキュリティ問題を解決するための実践的なガイドであり、サンプル コードも含まれています。 1. SQL インジェクション SQL インジェクション攻撃を防ぐには、プリペアド ステートメントまたはパラメータ化されたクエリを使用します。例: constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

See all articles