Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
ER図とは?書き方やテクニックをわかりやすく解説 公開日 2023.10.06 更新日 2026.05.28 株式会社システムインテグレータ ER図(Entity Relationship Diagram)とはデータベース設計における代表的な設計図のことです。 システムを設計する手法としては他にもUMLなどの技法がありますが、ER図はDOA(データ中心アプローチ)の技法であり、作成したER図がそのまま物理データベース上に変換できることから、データベース設計手法におけるデファクトスタンダードとなっています。 大規模なシステム開発においてはER図は必要不可欠です。そこで、これからはじめてER図を書くという方向けに、ER図の概要や書き方、テクニックなどについてご紹介します。 ER図のEはエンティティ(Entity)の略で、Rはリレーションシップ(Relationship)の略です。つまりER図は
SQL Server のクエリの実行方法として ストアドプロシージャ を使用することができます。 ストアドプロシージャを使用することのメリットとしては、次のような内容があります。 アプリケーションから SQL Server に送信されるテキストの削減によるトラフィックの効率化 クエリのパラメーター化による、SQL インジェクションの保護 コードの再利用性の向上 クエリコンパイルの削減によるパフォーマンスの向上 本投稿では「4.」について、極端な例を題材にして、ストアドプロシージャのリコンパイルについてみていきたいと思います。 コンパイルとリコンパイル ストアドプロシージャの実行時に、実行プランが作成されるタイミングとしては、「コンパイル」「リコンパイル」の 2 種類のイベントがあります。 コンパイル コンパイルは、ストアドプロシージャの実行プランが「メモリ上にキャッシュされていない場合」に
データパーティションとは データパーティションとは、データの格納場所を分割することができる機能です。 1つのテーブルを日付の範囲などで、複数に行分割することができます。 パーティション化することのメリットとは 行を分割することによって、アクセスを迅速かつ効率的に行うことができます。 例えば、過去10年間分の膨大なデータを保持しているテーブルがあったとします。 実際によくアクセスするのは直近2年くらい、といった場合に、年で分割しておくと、アクセスを必要なデータのみにあらかじめ絞る事が出来るので、処理を効率化することができます。 実態は分割されていても理論的には1つのテーブルに見えているので、クエリを書く側はパーティション化されている事を意識することなく使用することができます。 パーティション化していない場合 パーティション化していれば、効率よくデータにアクセスできる 実際にパーティションを設
T-SQL (Transact-SQL) とは Microsoft と Sybase 開発した、スタンダードの SQL (Structured Query Languag) を拡張した言語で、Microsoft SQL Server で使われています。 制御フローの言語や、ローカル変数、文字列・日付・数値処理等のファンクション、DELETE や UPATE ステートメントの文法等が拡張されています。 データの取得・挿入・更新・削除と、テーブルの作成・変更・削除、ファンクションやストアド プロシージャの作成等、Microsoft SQL Server を使って開発するのに必要な T-SQL の書き方やポイントをご紹介します。 SQL の基本 - SELECT 文 JOIN (結合) を使いこなそう T-SQL でテーブルへデータの挿入・更新・削除 T-SQL でテーブルの作成・変更・削除 よ
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? こんにちは。 本投稿では、Aurora MySQL 2 の EOS と Aurora MySQL 3 へのバージョンアップについての情報を提供するとともに、SQL テストツールを使って、バージョンアップテストを効率化する方法を紹介します。 はじめに いよいよ Amazon Aurora MySQL 2 の EOS ( end of support、サポート終了 ) が2024年10月にやってきます!※余談ですが、EOL ( end of life ) と言う場合もあります。 移行 ( バージョンアップ ) の準備は進んでいますか? また
環境 CREATE TABLE `t2` ( `id` int NOT NULL, `id2` int NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`), KEY `id2` (`id2`) ) mysql> select version(); +--------------+ | version() | +--------------+ | 8.0.28-debug | +--------------+ 1 row in set (0.00 sec) mysql> select @@auto_increment_increment; +----------------------------+ | @@auto_increment_increment | +----------------------------+ | 1 | +----------
はじめに Goの新しいORMを見かけたので、使ってみました。 今回はCRUDだけです。 「Bun」とは Bunは、Go用のSQLファーストのデータベースクライアントです。SQLファーストとは、ほとんどのSQLクエリを自動的にBun式にコンパイルでき、Bun式はSQLクエリのように見えることを意味します。 Bunの目的は、古き良きSQLを使用してクエリを記述できるようにし、結果を一般的なGo型(構造体、マップ、スライス、スカラー)にスキャンできるようにすることです。 らしいです。 ※公式より引用 GORMよりも早いみたいです。 Bunの良いところは公式にPlayGroundがあり、そこにSQL文を貼り付けると自動的にBunのコードに変換してくれるところが素晴らしい!(ただし取得のみ) サブクエリとかJoinしまくりの複雑な取得も一発で解決します!!(これは本当に凄い!) 環境 go 1.17
ANDPADボードチームの原田(tomtwinkle)です。 Node.jsの mysqljs/mysql の仕様に起因するSQLインジェクションが話題に上がっていたので、それGolangのORMであるGormでも同じような「仕様」があるよ! という注意喚起の意味も込めて筆を執りました。 ※ 2022/02/21追記 コードレビューを自動化して指摘してもらう記事を公開しました! tech.andpad.co.jp Node.jsのMySQLパッケージにおけるエスケープ処理だけでは防げない「隠れた」SQLインジェクション | 株式会社Flatt Security TL;DR GormのQuery Conditions関数に関する危険な仕様 対策 締め TL;DR GormのConditions関数(Find, First, Delete...)を使用する際、第2引数の値にStringを引き渡
はじめに こんにちは。ブランドソリューション開発本部FAANSバックエンドブロックの佐野です。普段はサーバーサイドエンジニアとして、FAANSのバックエンドシステムを開発しています。 FAANSとは、弊社が2022年8月に正式ローンチした、アパレル店舗で働くショップスタッフの販売サポートツールです。例えば、コーディネート投稿機能や成果確認機能などを備えています。投稿されたコーディネートはZOZOTOWNやWEAR、Yahoo!ショッピング、ブランド様のECサイトへの連携が可能です。成果確認機能では、投稿されたコーディネート経由のEC売上やコーディネート閲覧数などの成果を可視化しています。 本記事では、成果データの集計処理におけるBigQueryのクエリ実行処理のユニットテストをGoで実装した取り組みと、その際の工夫についてご紹介します。 目次 はじめに 目次 成果データの集計処理とは 抱え
普通に考えて、スコアとか、他の値も取りたいですよね。 group byしちゃうと取れないので、元のテーブルにjoinして取得しましょう。 select user_scores.* from user_scores inner join ( select user_id, max(created_at) created_at from user_scores group by user_id ) t1 on user_scores.user_id = t1.user_id and user_scores.created_at = t1.created_at ; こうなりますね。 usersテーブルにjoinしてscoreを取りたいよ〜という場合は、こうなります。 select users.*, latest_scores.score from users inner join ( selec
以下の文章は、Martin Fowler による Domain Logic and SQLの日本語訳である。 データベース指向ソフトウェア開発者とメモリ上(in-memory)アプリケーションソフトウェア開発者との間のギャップは、ここ数十年、徐々に広がってきている。このギャップが原因で、データベースの機能(SQLやストアドプロシージャ)をどのように扱えばよいのかという議論が数多く巻き起こっている。ここでは、ビジネスロジックを SQL に置くべきか、それともメモリ上のコードに置くべきかといった問題について、主にパフォーマンスと更新性の観点から考察を行う。考察には簡単な例を使うが、SQL クエリはしっかりとしたもの(rich SQL queries)を用いるので悪しからず。 エンタープライズアプリケーション(訳注:以下、EA)構築に関する本(私の近著『P of EAA』など)を読むと、ロジック
SQLを高速化するコツ・テクニック ここでは、SQLを高速化するための方法について次の内容を解説します。 キーワードは大文字を使う カラムの演算はしない サブクエリの引数は「EXISTS述語」を使う 「BETWEEN」は基本的に使う必要なし EXISTS述語のサブクエリ内では「SELECT *」を使う 極値関数(MAX / MIN)でインデックスを活用する 行数を数えるときは「COUNT(列名)」を使う 「GROUP BY句」でインデックスを活用する 「ORDER BY句」でインデックスを活用する UNION、INTERSECT、EXCEPT には「ALL」を付ける 実はインデックスが使用されていない 行ポインタによるアクセスが最速 ワイルドカードは使わない カラム番号は使わない テーブルに別名をつける 暗黙の型変換は回避する IN述語の引数は「最もありそうなキー」を左に記述する 1つずつ
2016-06-15タイトルを変更、DBA_USERSを順番に並べる例を追加 2016-06-10記事公開 列データの大きい、または小さい順の最初の数件を出力する場合に使用できる関数について説明します。 データの順番に番号の付与が可能な関数を使用することで、指定した件数に絞る事が出来ます。 以下DBA_USERSを並び替えた例です。Sから始まるユーザ名をACCOUNT_STATUS毎に、USERNAMEのアルファベットが若い順の番号を付与しています。 ACCOUNT_STATUS毎に上位5件を出力しています。 SQL> set pages 1000 line 120 trim on SQL> column USERNAME format a25 SQL> select * 2 from ( 3 select USERNAME 4 , ACCOUNT_STATUS 5 -- ACCOUNT_
SQLの仕様上SELECTで取得できる列の並びが保証されているのはORDER BYが指定されている場合のみです。指定されていない場合の挙動は仕様には定義されていないので、実装依存となります。 そこで実装側を考えると、一定の並びを保証するということはその通りに並び替えるコストが生じることになりますので、ORDER BYを指定しないというのは利用者からすれば余計な処理はするなという意思表示でもあります。従って多くの実装ではORDER BYが指定されない場合は特別に並び替えをしません。 したがって、 指定しない場合は、どういう基準で、並び順を決定しているのでしょうか? という疑問への答えは、「並び順を決定していない」となります。 実際に列の順番がどうなるかはストレージ上の並びかもしれませんしインデックス順かもしれません。実行計画によっても変わるでしょうからエンジンのバージョンにって変わるのも当然
今回は、あまり見かけないようで意外と必要になる「複数のテーブルに対して多対一で紐づくテーブル」の設計について、4つのアプローチをご紹介します。 ポリモーフィック関連、複数の関連テーブル、親テーブルの作成方法や分割。また、どの方法を用いて設計を行うかの判断基準も解説します。 弊社スパイスファクトリーでは設計において豊富な実績があります。弊社の概要やサービスプラン、過去の導入実績などをまとめた資料をご用意しました。 気になる方はこちらからダウンロードしてください。 どのようなケース? あるテーブルが複数のテーブルのいずれかに対して、自身が多、紐付き先が一で関連する場合のテーブル設計です。 例えば、「記事」と「画像」を投稿できるようなSNSを想定します。 この時、閲覧者が投稿された「記事」と「画像」のどちらにも「コメント」をつけることができる機能があったとします。 このような場合に、どのようなテ
エンジニアの佐野です。今日はカンムの決済システムでユーザの残高管理をどうやっているかについて書きます。 カンムの製品であるバンドルカードはプリペイド方式のカードです。ユーザによる入金、店舗での利用、運営事由の操作などによりユーザの残高が増減します。このような残高の管理について単純に考えると user_id と balance と updated_at あたりをもったテーブルを用意して balance と updated_at を更新していく方法があるかもしれません。しかしながらカンムでは残高を管理するテーブルを持たず、これらイベントの履歴のみで残高を管理しています。以下、本記事ではこれらユーザの残高が増減するイベントのことをトランザクションと呼びます。ここでは DB の Transaction Processing を意味しません。 本記事のポイントは 残高を管理をするテーブルは作らず、ト
はじめに Twitterのタイムラインを見ていたらバッチ系のプログラムで逐次コミットをやめて一括コミットにしたら爆速になったというのを見ました。当たり前でしょ、と思ったけど確かに知らなければ分からないよね、と思って主に初心者向けにRDBを扱うときの注意点をまとめてみました。 プログラミングテクニック的なところからテーブル設計くらいの範疇でDBチューニングとかは入ってないです。 自分の経験的にOracleをベースに書いていますが、他のRDBでも特に変わらないレベルの粒度だと思います。 大量の逐次コミットをする バッチアプリケーションでDBにデータをインサートすると言うのはかなり一般的な処理です。しかしデータ量が少ない時はともかく大量のインサートを逐次コミットで処理するとめちゃくちゃ遅くなります。数倍から十数倍遅くなることもあるので、10分程度のバッチが1時間越えに化けることもザラにあるので原
特徴・機能 様々なデータベースへの接続 Oracle Database へはOCI接続(オラクルクライアント経由)、直接接続(オラクルクライアント不要)で接続出来ます。 PostgreSQL, MySQLへは直接接続(クライアントライブラリ不要)で接続出来ます。 Microsoft SQL Server へは NativeClient 経由で接続できます。 それ以外のデータベースへはADO(OLE DB)または、ODBCで接続出来ます。 SQL入力支援機能 Ctrl+SpaceでSQL文を解析しテーブル名やテーブルカラム名の入力補完が行えます。 共通表式や副照会も解析する強力な機能です。 AIアシスタント機能 外部AIサービス(OpenAI ChatGPT, Google Gemini, Anthoropic Claude, Microsoft Azure OpenAI, Ollama)の
SQL、書いてますか? こと大規模データ処理の分野においてはSQLはもはや標準インターフェイスであり、 分析やらバッチやらに関わっている皆様は日々大量のSQLクエリーを生産していることと思います。 そこでちょっと気になるのが、 SQLのコーディングスタイルってどうするのが一般的なんだっけ……? という点です。 イマドキはSQLなんてO/R mapperに吐かせることが多いからなのか、 それともコードを広い範囲で共有することがそもそもないからか、 SQLのコーディングスタイルについて見聞きすることは他のプログラミング言語に比べるとだいぶ少なく、 いまいち決定版と言えるスタイルがないなと感じています。 そんなわけで本日は、SQLのコーディングスタイルについての意識を活発化させるべく、 クックパッドでわたし(青木)が使っているコーディングスタイルから特徴的な点を紹介したいと思います。 特に、分析
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く