やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

データベース

今更ながらMATERIALIZED VIEW(マテリアライズドビュー)について学ぶ

アプリケーションにおいて高負荷になりやすい処理の一つにレポート・データ集計があります。 リアルタイム性が求められる場合もあれば、ある時点までに集計されたデータを見れればOKなど、要件はさまざまですが、一般的にはデータベースに対して複雑なクエリ…

NULL値が含まれるカラムにインデックスは有効なのか

データベースで0対Nのモデルを表現する際に、よく外部キー制約とNULL許容の制約を定義することがあります。 値は特定のテーブルのIDもしくはNULLのどちらかを持つことになります。これを出版社(publishers)と書籍(books)のモデルをテーブルに落とし込んでみ…

データベースにおけるJSON型のカラムの使い所

最近、データベースのテーブル設計を担当したり、既存のテーブル設計を見ることが多いです。 テーブルの設計書を見てみるとJSON型が指定されているカラムが目につくことがあります。既存のテーブルでもJSON型が使われている箇所がありました。 「json型を使…

中間テーブルへのデータ更新(削除・追加)を効率的に行う方法

以下のようなテーブルがあったとします。 ユーザーは記事(posts)に対して、自由にタグ(tags)を設定することが可能です。 記事とタグは多対多の関係にあるため、中間テーブル(post_tags)にて記事へ設定したタグの一覧を管理しています。 仕様上、ユーザーは記…

JOIN高速化のためにインデックスを作成しても効果はないのか

業務中に以前、自分が書いた記事を読み返す機会がありました。 www.okb-shelf.work JOINを使っているSQLを高速化できないかと思って新規インデックスの作成を検討をしていました。 ただし、過去の記事にも書いた通り「結合述語にインデックスを作成しても、…

PostgreSQLでboolean型のカラムを持つレコードを取得するとt, fとなる

Rubyでpg gemを使って、postgresqlに接続してクエリの実行結果を見ていたところ、boolean型のカラムの戻り値がTRUEの場合にt、FALSEの場合にfとなる現象を確認しました。 CREATE TABLE test1 (a boolean, b text); INSERT INTO test1 VALUES (TRUE, 'sic est…

トランザクションがあれば安心ではないのでRailsでもロックをかけたい

Railsでトランザクションを扱いたい時はActiveRecordに実装されたtransactionメソッドを呼び出します。 ActiveRecord::Base::transaction do : end 今までRailsでトランザクションのブロックを宣言した時は、他のトランザクションからデータの取得、更新は出…

Railsのマイグレーションファイルでt.stringを使うときはlimitを指定してほしい

Railsではマイグレーションファイルを作成してマイグレートを実行することで、テーブルが作成されます。 非常に便利で手軽にテーブルの定義・作成ができるのですが、マイグレートされた結果、どのような型が選択されるのかが隠蔽化されるという問題があると…

中間テーブルには複合インデックスと単一インデックスどちらを作成すれば良いのか

データベースの設計において正規化の結果、中間テーブルを作ることがよくあると思います。 以下のようなテーブル群があったとします。登録されたユーザーと登録された商品を誰が出品した商品なのかを中間テーブルへ記録しています。 users products user_pro…

スプラトゥーン3のER図について考える【キャラクター編】

こちらの記事を見て、自分も別のテーマでやってみたいと思います。 ちょうど同じ任天堂のスプラトゥーン3にドハマりしているので、スプラトゥーン3を題材にやってみます。 qiita.com なかなか、新規にデータベース設計をすることはないので、良い練習になり…

M1mac+homebrewでpostgresql.confがある場所

探してみるも見つからず SQLの統計情報の記録の設定しようと思い、以下を参考にpostgresql.confを探してみるも見つからず... stackoverflow.com homebrewを使っているところは同じようだけど、どうやらOSが違う、いやM1macなのが原因かと思い調べているとや…

postgresqlにおけるテーブルスキャンの実行例

テーブルスキャン postgresqlでは、テーブルスキャンに該当する演算子が5つあります。 Seq scan: インデックスを使用せず、全件を検索 Index scan: インデックスを使用してスキャン Bitmap scan: ビットマップを使用してスキャン Index only scan: 問い合わ…

【SQL】結合によって結合元テーブルの行数が増えるケースについて

質問サイトを巡回中に発見 LEFT JOINを実行した際に、NULLの値を持つレコードが増えるケースについては認知していましたが、ただのJOINの時にもレコード数が増えることを経験しました。 SQLに詳しい方から見れば、当たり前でしょと思われるかもしれませんが…

スッキリわかるSQL第3版の発売に合わせて手元PCで実行できるようになっていた

SQLの習得にはスッキリわかるSQLでしょ 私がSQLが全く分からなかった時に非常にお世話になったのがインプレスから出版されている「スッキリわかるSQL入門」という書籍です。 www.okb-shelf.work 対話形式で図やイラストが多く、SQLをほとんど全く知らなかっ…

pandasでの保存形式はcsv、h5、pklでどれが良いのか

h5というファイル形式があることを知る オライリーから発売されたpythonではじめるアルゴリズムトレードを読み進めていた所、金融の取引データをpandas.DataFrameからh5という形式のファイルに出力していました。h5というファイルは階層的データを扱うための…

【2022年版】DB-ENGINESよりデータベースの人気ランキングを見てみる

海外のDB-ENGINESというサイトで紹介されています。以下の画像は2022年5月度の集計結果です。 データベースランキング Oracle MySQL Microsoft SQL Server PostgreSql MongoDB 1位から5位まではランキングにほとんど変更がないようで、ほとんどがRDBです。自…

pythonでブルームフィルターを作って覚える

ブルームフィルター(Bloom Filter)とは ブルームフィルターというのは1970年にブルームさんが作った確率的データ構造と呼ばれるデータ構造の1つです。 データ構造というのは 配列 連想配列 リスト などをイメージしてもらえば良いのですが、確率的データ構造…

モチベーションがなくなった結果、データベースについて2ヶ月間勉強した

概要 新卒4年目にして業務の慢性化、スキルアップの実感の無さからモチベーションが低下した 得た知識が業務で高確率で役に立つ知識(投資効果の高い)を得ようと思い立つ 投資効果の高いスキルはほぼ100%どのプロジェクトでも使われるデータベースだと考えた …