タグ

designとDBに関するraimon49のブックマーク (40)

  • なぜSQLiteはバイトコードを使うのか

    以前にデータベースを自作しようとして、SQLiteのアーキテクチャを見てみたらVMだったことに疑問を感じ、それをツイートしたところ作者からリプをもらいました。 作者いわく、次のような背景があったとのことでした。 SQLiteを作った当初はデータベースエンジンのことをよく知らないがコンパイラのことをよく知っていた SQLデータベース・エンジンを書くという問題をコンパイラ構築の問題として扱うのは自然なことだった データベースエンジンのコアの部分をVMにするという発想がまったくなかったので、どんなメリットがあるのか?と気になっていました。 それを作者に聞いたら、詳細な説明ページを作ってくれました。 個人的にVMにしたことで、評価&実行のパフォーマンスは多少良くなると思うが、データベースエンジンのパフォーマンスにそれほど寄与していないんじゃないかな?って思ったりしました。 記事はそのページについ

    なぜSQLiteはバイトコードを使うのか
  • データベースでユニークキーにUUIDを使うメリットは何ですか?連番やタイムスタンプまたは複合などではいけないのでしょうか?どうも視認性が悪く使いにくく感じますし連番でも衝突しない気もします。

    回答 (7件中の1件目) まずはUUID及びその対案として用いられる連番(自動採番)のメリット・デメリットを整理します。 (タイムスタンプキーや複合キーなどもその効率性から設計上有用なシーンはありますが、比較から除外します。) * UUIDを使うことのメリット * * データベースにSQLを送信する前からアプリケーションレイヤーでIDを生成できる。 * * トランザクション処理を実装しやすい場合がある。 * IDを推測しにくい。リソースが列挙可能ではない。 * UUIDを使うことのデメリット * * レコード・インデックスサイズが増加する。 * * ...

    データベースでユニークキーにUUIDを使うメリットは何ですか?連番やタイムスタンプまたは複合などではいけないのでしょうか?どうも視認性が悪く使いにくく感じますし連番でも衝突しない気もします。
  • GIPKことはじめ - Generated Invisible Primary Keys

    ※この記事はMySQL Advent Calendar 2023の4日目です。 MySQL 8.0シリーズでは正式版になってから多数の新機能が追加されるというリリースモデルであった。正式版になってから追加された新機能の中に、GIPK(Generated Invisible Primary Key)というものがある。これはなんとMySQL 8.0.30で追加された機能だ。MySQL 8.0が正式版になってから、なんと4年と3ヶ月後のことである。そんな感じでMySQL 8.0の新機能は正式リリース後にも増え続け、途方もない規模になっている。このブログでは一度に紹介するのは諦め、少しずつ気の向いたものから紹介していこうと思う。今回はその第一弾として、GIPKについて解説しよう。 GIPKとは GIPKとは、その名前が示すように、自動的に生成される不可視の主キーである。主キーを持たないテーブルに対

    GIPKことはじめ - Generated Invisible Primary Keys
  • Rust の DI を考える –– Part 2: Rust における DI の手法の整理 - paild tech blog

    paild 社でお手伝いをしている yuki です。前回に引き続き Dependency Injection 略して DI の話題を書いていきたいと思います。今回は Rust における DI についていろいろと考えてみました。今回紹介する実装はかなり単純な例を用いたもので、この記事からさらにみなさんのアプリケーションの実装状況に合わせていくつか工夫は必要になるかもしれません。ただ、とっかかりとしては十分なものになっていると思うので、DI でお困りの方はぜひ参考にしてみてください。 今回実装したいアプリケーションのお題について 今回紹介する技法の種別について コンストラクタインジェクション 静的ディスパッチを用いたもの 動的ディスパッチを用いたもの 静的ディスパッチと動的ディスパッチの利点・欠点 shaku (DI コンテナ)を用いたインジェクション shaku の利点・欠点 余談: DI

    Rust の DI を考える –– Part 2: Rust における DI の手法の整理 - paild tech blog
  • Rust の DI を考える — Part 1: DI とは何だったか - paild tech blog

    paild 社でお手伝いをしている yuki です。みなさんは Rust で DI をしようと思った際に困ったことはありませんか?この連載では、他のプログラミング言語で利用される DI パターンを参照しながら、Rust でそれを実装するためにはどのような工夫が必要かまでを検討します。中には Rust での実装が難しいパターンも出てくるかもしれません。その際は、なぜ難しいのかまでを検証します。 そこそこの規模のソフトウェアを実装するにあたって、ソフトウェアエンジニアが共通して利用する手法がいくつかあると思います。その中でも DI (Dependency Injection; 依存オブジェクト注入) は最もポピュラーな手法の一つであり、保守運用まできちんと耐えうるソフトウェアの設計をしたいとなったときに、まず真っ先に候補に上がる手法でしょう。 Rust ではこの DI をどのように行えばよいの

    Rust の DI を考える — Part 1: DI とは何だったか - paild tech blog
  • ポケモンを「誰がデザインしたか」を記録するデータベースに注目集まる。ポケモンの増加と時代の波 - AUTOMATON

    『ポケットモンスター』シリーズには、多数のポケモンが存在する。いまや800匹以上存在しており、新作 『ポケットモンスター スカーレット・バイオレット』でも新ポケモンが登場することが明かされており、1000匹の大台も視野に入ってきている。そんな中、それぞれのポケモンをデザインした人物を、整理しようとするユーザーが現れ、注目を集めている。 きっかけとなったのは、ResetEraのスレッドだ。同スレッドを立てたユーザーは、『ポケットモンスター 赤・緑』のデザインおよびそれらを手がけた杉森健氏が称賛される傾向にあるとコメント。同作でポケモンを手がけたのは杉森氏だけではないとし、データベースサイトBulbagardenのとあるページを引用。ここから「誰がどのデザインを手がけたか」という話題が盛り上がっているようだ。 とはいえ、このページのデザイナーリストは、まだまだ情報が集まっていない。それもそのは

    ポケモンを「誰がデザインしたか」を記録するデータベースに注目集まる。ポケモンの増加と時代の波 - AUTOMATON
  • 表示順という属性を別テーブルに分ける - そーだいなるらくがき帳

    最近、この説明を複数回したので記事にする。 要約 普段は 今北産業 派なのだが、3行考えるのが面倒なため、今後は大人の表現を使う。 「今北産業」をスタートアップ語にすると「マジ価値サマリー」になるらしい ちなみにここだけの話ですが、大人語にすると「要約」になります pic.twitter.com/Q8SflvBX7c— ところてん (@tokoroten) 2022年1月24日 画面に表示したい順(以下、表示順)は振る舞いの属性なので分ける 似たような振る舞いに関わる属性は別テーブルにわけると良い 普通に正規化しましょうって話。 表示順をカラムを追加して表現する よくあるテーブルは画面情報と合わせて表示順カラムがあるパターン。 こういうテーブルを作って SELECT * FROM items ORDER BY display_order_number; で表示順に取り出すパターン。 表示順

    表示順という属性を別テーブルに分ける - そーだいなるらくがき帳
  • 決済システムの残高管理周りの DB 設計と戦略 - カンムテックブログ

    エンジニアの佐野です。今日はカンムの決済システムでユーザの残高管理をどうやっているかについて書きます。 カンムの製品であるバンドルカードはプリペイド方式のカードです。ユーザによる入金、店舗での利用、運営事由の操作などによりユーザの残高が増減します。このような残高の管理について単純に考えると user_id と balance と updated_at あたりをもったテーブルを用意して balance と updated_at を更新していく方法があるかもしれません。しかしながらカンムでは残高を管理するテーブルを持たず、これらイベントの履歴のみで残高を管理しています。以下、記事ではこれらユーザの残高が増減するイベントのことをトランザクションと呼びます。ここでは DB の Transaction Processing を意味しません。 記事のポイントは 残高を管理をするテーブルは作らず、ト

    決済システムの残高管理周りの DB 設計と戦略 - カンムテックブログ
  • Go の sql.DB がコネクションプールを管理する仕組み

    Godatabase/sql パッケージ の DB 構造体 は、データベースへのコネクションプールを管理し、かつスレッドセーフ (goroutine セーフと言ったほうが良いのだろうか…?) にそれらの接続を使用できることを保証している。 ドキュメント にも次のように書かれている。 DB is a database handle representing a pool of zero or more underlying connections. It’s safe for concurrent use by multiple goroutines. こちらの基的な実装内容と、動作を制御するパラメータについて調べてみた。 基礎知識のおさらい database/sql パッケージはデータストアの実装によらない一般的な SQL のインタフェースを提供している。具体的なデータストアへの接

    Go の sql.DB がコネクションプールを管理する仕組み
  • パーフェクトRails著者が解説するdeviseの現代的なユーザー認証のモデル構成について - joker1007’s diary

    最近、パーフェクトRuby on Railsの増補改訂版をリリースさせていただいた身なので、久しぶりにRailsについて書いてみようと思う。 まあ、書籍の宣伝みたいなものです。 数日前に、noteというサービスでWebフロント側に投稿者のIPアドレスが露出するという漏洩事故が起きました。これがどれぐらい問題かは一旦置いておいて、何故こういうことになるのか、そしてRailsでよく使われるdeviseという認証機構作成ライブラリのより良い使い方について話をしていきます。 (noteRailsを使っているか、ここで話をするdeviseを採用しているかは定かではないので、ここから先の話はその事故とは直接関係ありません。Railsだったとしても恐らく使ってないか変な使い方してると思うんですが、理由は後述) 何故こんなことが起きるのか そもそも、フロント側に何故IPアドレスを送ってんだ、という話です

    パーフェクトRails著者が解説するdeviseの現代的なユーザー認証のモデル構成について - joker1007’s diary
  • GraphQLとRESTfulについて今日考えてたこと Backend for Usecase/Resourceについて - 余白

    DISCLAIMER: これは当にただのメモ書きで、これがベストプラクティスだとかいう話ではないので、同じようなことを考えてる人いたら今度議論しましょうよ、って程度の話の種。 GraphQLを使うべきスポット、RESTfulが好ましいスポットについて今日ぼんやり考えていて、なんとなく言語化ができる気がするので文字起こししてみる。 Backend for UsecaseとBackend for Resource バックエンドのAPIには2種類あって、 「データ」を構成する「リソース」を提供するもの アプリケーションの「ユースケース」がもつシナリオのなかで登場する「データ」部分を埋めるためのもの を区別することが必要そう、と思っている。 まず前者を Backend for Resource (BFR)と呼ぶことにする。これはわかりやすくて、これはまさしくRESTfulそのもの。 RDBやそう

    GraphQLとRESTfulについて今日考えてたこと Backend for Usecase/Resourceについて - 余白
    raimon49
    raimon49 2018/07/13
    BFF用途にGraphQLが向いててRESTとはシステムのライフサイクルが違う、という整理にしっくりくる。
  • ユーザ情報を保存する時のテーブル設計 - そーだいなるらくがき帳

    はじめに ※この発言は個人の見解であり、所属する組織の公式見解ではありません 用法用量を守り、個人の責任で業務に投入してください 参考資料 2024/02/14追記 実際のテーブル設計の詳細はこちらを参考にどうぞ。 agilejourney.uzabase.com 要件 User情報を保存するときにどのようなテーブル設計を行うか 今北産業で頼む テーブルに状態を持たせず状態毎のテーブルを作る 状態が変わればレコードを消して別のtableに作る tableの普遍的な情報は別に持たせる 僕の考えた最強のDB設計 PostgreSQLをベースの雑なER図を作った。 これを元に話を進める。 table構成 users 親tableであり、すべてのユーザはここに属する。 基はINSERTのみでUPDATE、DELETEを考慮しない。 user_detail userに付随する詳細の情報がここに登録

    ユーザ情報を保存する時のテーブル設計 - そーだいなるらくがき帳
    raimon49
    raimon49 2018/05/02
    親となるusersテーブルを削除フラグやトランザクションから守ることを可能とする設計。ユーザーのIDが生きてるか退会済みかは、専用にテーブルを作って管理する。
  • 6. LuaJIT、Lisp、Forth、PostScript、メタオブジェクトプロトコル、勉強に良いソースコード

    Miuraさんと一緒にいろいろなスクリプト言語の実装や言語そのものなどについて話をしました。出演者: Miura Hideki (@miura1729)、Rui Ueyama (@rui314) https://turingcomplete.fm/6 ハッシュタグは#tcfmです。 TCFMはサポーターの投げ銭によって収益を上げています。このコンテンツに課金してもいいよという方はぜひクリエイター支援サイトPatreonから登録してご協力ください。 LuaとLuaJIT (0:00) 例外のABI (8:25) SQLiteとライセンス (12:45) ファイルシステムとデータベース (16:23) XLISPで言語の書き方を学んだ (19:15) C++の後方互換性とトライグラフ (21:55) Common Lispのメタオブジェクトプロトコル (26:18) Gauche Scheme

    6. LuaJIT、Lisp、Forth、PostScript、メタオブジェクトプロトコル、勉強に良いソースコード
  • DBリファクタリングの勘所と所感 - そーだいなるらくがき帳

    表題についてそーだいなる見解を書き残します。 今年の夏に id:koemu さんにbuilderconの懇親会で下記のような話をいただいていました。 懇親会で、DB側ばかりでなくプログラム側でも適切なドメインモデルの設計ができていれば、リファクタリング時の影響範囲がさらに小さくできるのでは?という話をしたところ、この辺りはアンサーブログを書いてくれるかもしれないってことなので期待しています!!! www.koemu.com 忘れてないんですよ!しっかり覚えています。 結論 仰る通りだと思うし、適切なドメインモデルはRDBに限らずデータストア層のリファクタリングの負担を大きく減らすと思います。 ここから先は僕なりの考え方を書きます。 実は似たような話を PHPの現場 っていうポッドキャストでも触れています。 php-genba.shin1x1.com システムの柔軟性 勿論、コードの綺麗さや

    DBリファクタリングの勘所と所感 - そーだいなるらくがき帳
    raimon49
    raimon49 2018/01/26
    >データベースにビジネスロジックを持たせることは悪手です。 だからこそRDB側には事実のみを保存することを意識することが大切です。 / アプリとRDBの責任分界点
  • RDBとNoSQLにみるDB近現代史 データベースに破壊的イノベーションは二度起きるか? - エンジニアHub|若手Webエンジニアのキャリアを考える!

    「ユーザー目線」のシステムを目指して RDBが従来の階層型DBに比べて優れていた点はいくつか挙げることができますが、シェアを伸ばすうえで最も大きな影響は、ユーザーが使いやすいデータ構造とインタフェースにこだわったことです。すなわち、「テーブル」と「SQL」の発明です。 RDBでは、すべてのデータを「テーブル」というただ一つのデータ形式によって表現します。テーブルは、見た目が「二次元表」に似ているため*3、Microsoft ExcelGoogle ドキュメントなどのスプレッドシートを使い慣れた人が見ると、データを格納する方法が直観的にイメージしやすいという利点があります。実際、こうした二次元表によるデータ管理は、Excelなどのソフトウェアが登場する前から一般的な方法だったため、RDBが登場した当時の人々にとっても受け入れやすいものでした。 テーブルが画期的だった点は、もう一つあります。

    RDBとNoSQLにみるDB近現代史 データベースに破壊的イノベーションは二度起きるか? - エンジニアHub|若手Webエンジニアのキャリアを考える!
    raimon49
    raimon49 2017/11/28
    >Postgresは「Post(後の)」+「Ingres」から付けられた名称です。 / ポスグレの前身としてIngresというRDBが生まれていた。
  • RDBアンチパターン // Speaker Deck

    PHPカンファレンス2016の資料です http://phpcon.php.gr.jp/2016/

    RDBアンチパターン // Speaker Deck
    raimon49
    raimon49 2016/11/03
    ステータスを表すカラムではなくレコードの追加で歴史を作る。
  • Nianticの求人から推測する『Pokémon GO(ポケモンGO)』のサーバ構成 - Qiita

    1ワールドで済ますというチャレンジ Nianticの求人を見ていて、凄く驚いたのは、「Software Engineer - Server Infrastructure」での次の項目。 all on a single, coherent world-wide instance shared by millions of users. 対訳 全ての(アクション)は、数百万のユーザーに共有された単一の一貫した(サーバ群で行われる) つまり、ポケモンGOは1ワールドで構成されている。MMOのサーバを作ったことがある人なら5それがどんなに大変かピンとくるだろう。特に、ポケモンGOの様に一日に数百万人とかが遊ぶゲームで、1ワールドでゲーム世界を構築するのは、結構大変だ。6 MMOで1ワールドがなぜ大変か(データストレージとの戦い) MMOの様なオンラインゲームで、1ワールドがなぜ大変かを図示する。

    Nianticの求人から推測する『Pokémon GO(ポケモンGO)』のサーバ構成 - Qiita
    raimon49
    raimon49 2016/09/22
    1ワールド構成の考察。
  • PHPerに知ってほしいRDBの事 その3

    PHPカンファレンス関西 2016の資料です。 http://conference.kphpug.jp/2016/

    PHPerに知ってほしいRDBの事 その3
  • スマートフォンの連絡帳の話。 - なるようになるかも

    純正の連絡帳で別に満足してるって人もいれば、オリジナルの連絡帳を入れてる人もいますし、そもそも連絡帳に何も登録されてない人もいるでしょう。 それはさておき、iOS や Android の OS 標準の連絡帳はユーザー視点で見るか、開発者視点で見るかで貧弱とも言えるし、高性能とも言えて面白いです。 連絡帳の基思想 iOS / Android に共通して言えることとして、実用的ではないです。グルーピング表示すらできません。 その理由は、OS 標準の連絡帳は、端末内の利用出来る情報を活用しつつ、様々なアプリへ連絡帳情報を提供するためのデータベースとなるよう、割り切った実装になっているからです。 連絡帳の元データは、多種多様です。 Android であれば Google アカウント、iOS であれば iCloud アカウントに紐付いていることが多いと思います。 その他にも SIM カードやソーシ

    スマートフォンの連絡帳の話。 - なるようになるかも
    raimon49
    raimon49 2016/06/23
    ロケール依存したソートや電話番号ルックアップ用テーブルの実装について。
  • Web系の自分が想像と障害で学んだバッチ処理・設計の基本 - コンポツさん

    バッチ処理というのはそれ単体で勉強しようとするとなかなか何を勉強したらいいのかわからないことが多い。 特に経験がWeb系ばっかりだと、いざバッチ処理を実装しようとした時に基的なノウハウを知らないままに書いてしまうことが多い。 バッチ処理というのは実態を整理すると「何らかのトリガーを期に起動し、データをロード・加工・変換・集計してから、出力する」という事になる。 まぁ、INがあって処理してOUTがあるという点では関数だと考えてもいいだろう。 システムの利用者(人に限らない)のアクションとは直接関係ない処理であったり、利用者のアクションをトリガーとしていても、即時にレスポンスがいらないor返せない場合に バッチ処理を選択する事が多い。 実現方式はシェルスクリプト、LL言語、実行可能バイナリだったりするし、デーモンとして立ち上げる場合もある。 利用者の操作に対して対話的・同期的な処理はオンライ

    Web系の自分が想像と障害で学んだバッチ処理・設計の基本 - コンポツさん
    raimon49
    raimon49 2016/02/18
    あるあるが多くて、見事な知見の言語化だ。