タグ

データベースに関するtkmkg8mのブックマーク (10)

  • RSpecで悲観的ロックのテストを書く - hitomedia Tech Blog

    こんにちは。花粉症で鼻水が止まらない日々が続いている hilotter です。 同一レコードに対し複数ユーザ(もしくはバッチ処理等)から同時に更新される可能性がある場合、排他制御を行う必要があります。 今回はシンプルなポイント付与機能を例に、悲観的ロックを用いた排他制御のテストを書いてみたいと思います。 シンプルなポイント付与機能仕様 ユーザは他のユーザにポイントを送ることができる 今回のサンプルは以下の環境で確認しました。 Rails 5.1.4 MySQL 5.7.20 MySQLのトランザクション分離レベル REPEATABLE-READ(デフォルト設定) add_pointメソッドの実装 Userモデルにポイントを付与できるadd_pointメソッドを追加します transaction内でlock!を用いて悲観的ロックをかけています。 # app/models/user.rb cl

    RSpecで悲観的ロックのテストを書く - hitomedia Tech Blog
    tkmkg8m
    tkmkg8m 2019/04/02
    スレッドを使って実現
  • MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ

    こんにちは、サービス開発部の荒引 (@a_bicky) です。 突然ですが、RDBMS の既存のテーブルを見てみたら「何でこんなにインデックスだらけなの?」みたいな経験はありませんか?不要なインデックスは容量を圧迫したり、挿入が遅くなったりと良いことがありません。 そんなわけで、今回はレコードを検索するために必要なインデックスの基礎知識と、よく見かける不適切なインデックスについて解説します。クックパッドでは Rails のデータベースとして主に MySQL 5.6、MySQL のストレージエンジンとして主に InnoDB を使っているので、MySQL 5.6 の InnoDB について解説します。 InnoDB のインデックスに関する基礎知識 インデックスの構造 (B+ 木) InnoDB では B+ 木が使われています。B+ 木は次のような特徴を持った木構造です。 次数を b とすると、

    MySQL with InnoDB のインデックスの基礎知識とありがちな間違い - クックパッド開発者ブログ
  • O/Rマッピングは百害あって一利なし! - Qiita

    O/Rマッピング(Object-relational mapping)について、Wikipediaには以下のように書かれています。 データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。 O/Rマッピングを実現する仕組みを、O/Rマッパーと言います。(両者を区別しなくても私が言いたいことは伝わると思いますので、ORMと統一して記述します)(また、個人的な理由で、プログラミング初学者向けに語りかける口調にしていますが、初心者向けの記事というわけではありません) 最近はWEBアプリ開発をするにあたって、WEBフレームワークに標準で何らかのORMが組み込まれていることが多いため、その存在を知らない人はまずいないでしょう。 私も何度かORMと向き合ってきましたが、そうこうしているうちに気がつきました。 ORMはめんどうくさい! …ってことに。 みん

    O/Rマッピングは百害あって一利なし! - Qiita
    tkmkg8m
    tkmkg8m 2018/11/17
    以前ほぼ同じネタで炎上して凍結されたのと同一人物かな。最初Mappingのみの話かと思ったら最終的にMapper丸ごとにすり替わってるし。クソ狭そうな観測範囲のみを根拠に言われても感。ORM使うときSQL学ぶべきなのは同意。
  • Create a database ERD in your CI/CD pipeline - We Build Internet

    tkmkg8m
    tkmkg8m 2018/05/17
    GitLab CIでER図を自動作成する
  • 集約の設計と実装

    AWS データベースブログの記事 「Amazon DynamoDBによる CQRSイベントストアの構築」 を勝手に読み解く

    集約の設計と実装
  • システムで「性別」の情報を扱う前に知っておくべきこと - Qiita

    0は性別に関する情報が得られない場合に使います。性別に関する情報はあるのだけど1とも2とも言えない場合は9を使います。要は「0でもなくて1でも2でもなければ9」です。 これを知っていればMだとかFだとかを議論をせずに済みますね。 国際規格に従うべき理由 国際規格に従うことは色々と利点があります。まず、どうしてそういうコード体系にしたのかを説明しやすいです。また多言語対応する際も規格通りに書けば伝わるはずなので迷わずに済みます。別システムへのデータの移行や、異なるシステム間でのデータの統合もコード体系が同じならラクラクです。もしかしたら別のプロジェクトで書いたコードをそのまま使いまわせるかもしれません。技術者に対するトレーニングも不要です。 対して、わざわざ国際規格に反する実装をする場合は上記のメリットがそのままひっくり返ってデメリットになりはしますが、もちろん、それなりの理由があれば規格と

    システムで「性別」の情報を扱う前に知っておくべきこと - Qiita
    tkmkg8m
    tkmkg8m 2018/04/13
    国際規格は参考になる。けど必ずしも従う必要はないと思ってる。nullableなカラムが必要以上に増えそう。RDBMS限られるけど型はENUM型が好きです。
  • ActiveRecordデータ処理アンチパターン / active-record-anti-patterns

    Rails Developers Meetup 2018: Day 2( https://techplay.jp/event/655769 )で行った発表の資料です。 ActiveRecordはWebエンジニア達が嫌う(?)SQLを書かずとも、Rubyオブジェクトで気軽にデータベースへアクセスできる魔法のようなツールです。しかし便利な反面、何も考えずにゴリゴリActiveRecordを使ってDBアクセスしていると、劇的に重たいクエリが発行されたり非効率的なクエリが量産されたりします。 発表ではそれらActiveRecordで陥りがちな罠をパターン化し、ActiveRecordデータ処理アンチパターンとして発表します。 ※発表では実際のサンプルコードとともにパフォーマンスの計測結果も紹介します。 --- Blog記事: http://blog.toshimaru.net/rdm2018-a

    ActiveRecordデータ処理アンチパターン / active-record-anti-patterns
  • ActiveRecord の where.not とド・モルガンの法則 - アジャイルSEの憂鬱

    where.not を使っていて遭遇した問題についてrailsdmの懇親会で話していたら、@kamipo さんから「5.2では少し直っている」という情報を頂いた。 この話をしているときに思ったけど、今の where.not の問題点について知らない人も多そうなので、せっかくなのでブログにまとめてみた。 where.notの問題 where.not のドキュメントにいくつか例がある。 問題は複数の条件を引数で指定した場合。 User.where.not(name: "Jon", role: "admin") # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin' これはド・モルガンの法則でORになりそうなのに、なっていない。 # ド・モルガンの法則 # NOT(A AND B) = NOT(A) OR NOT(B) # つま

    ActiveRecord の where.not とド・モルガンの法則 - アジャイルSEの憂鬱
    tkmkg8m
    tkmkg8m 2018/03/27
    where.notに複数条件渡したことないけど、これ危ないなぁ。暗黙的になってるとバグりそう。
  • MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる

    仕事やらなんやらでMySQLのクエリの良し悪しを判断する必要があるとき、EXPLAINの内容だけだとどのぐらい良くなったり悪くなったのか分からないので SET long_query_time = 0; してrows_examined (そのクエリでrows_sent行の結果を返すために何行に触ったのか)も一緒に提示するようにしている(少なくともMySQL 5.7時点ではrows_examinedはslow_query_logでしか確認できないはずperformance_schemaが有効ならevents_statements_historyやその仲間たちで確認できるとのこと*1 MySQL :: MySQL 5.6 リファレンスマニュアル :: 22.9.6 パフォーマンススキーマステートメントイベントテーブル)。 例: 上の例のBeforeは、もともとDBAが書いた温かみのあるSQLでO

    MySQLのクエリの良し悪しはrows_examinedで判断する - かみぽわーる
    tkmkg8m
    tkmkg8m 2018/03/22
    “SET long_query_time = 0; してrows_examined”を見る。温かみのあるコードが深遠な理由で書き換えられるのあるある。
  • Rails tips: トランザクションをネストする(翻訳)|TechRacho by BPS株式会社

    概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Learn how to use nested transactions in a Ruby on Rails application 原文公開日: 2018/02/02 著者: Paweł Dąbrowsk Ruby on Railsにおけるトランザクションの概要や、アプリに機能追加するときに便利なトランザクションのコールバックについては既にご説明しました。今回はトランザクションのネストについて詳しく見ていきたいと思います。 ネストしたトランザクションを作成する トランザクションは単なるRubyのブロックなので、次のように簡単にネストできます。 Post.transaction do Post.create!(title: 'Playing football') Post.transaction do Post.create!(

    Rails tips: トランザクションをネストする(翻訳)|TechRacho by BPS株式会社
    tkmkg8m
    tkmkg8m 2018/03/19
    トランザクションのネストに意味ある使い方あるの知らなかった……
  • 1