Skip to content

Instantly share code, notes, and snippets.

@yyYank
Last active August 29, 2015 14:27
Show Gist options
  • Save yyYank/846ce6397b9af6fc77e1 to your computer and use it in GitHub Desktop.
Save yyYank/846ce6397b9af6fc77e1 to your computer and use it in GitHub Desktop.
なんかしら、本を読んだ時に気になったこととかまとめる感じの雑記系。というかSQLアンチパターンを読みつつのメモ。

全般的な話

SQLの関数の対象

SQL関数AVG、SUM、COUNTなどは単一行ではなく複数行を対象としている

SQLの標準規格

ANSIとISOで規格化されている。

  • SQL86
  • SQL89
  • SQL92
  • SQL:2003
  • SQL:2008

など。

indexの複数形

indexesとindicesどちらも正しいらしい。まじか。

用語

  • データ定義言語(DDL:Data Definition Language)

CREATE文とかテーブルを作ったりという、なんというか集合の定義という感じか。

  • データ操作言語(DML:Data Manipulation Language)

いわゆるCRUD処理のこと。 DDLはよく聞くけど、DMLって好んでこの用語使う人あんまいないかもなぁ。

  • 参照整合性

関係モデルにおいて2つの関連しあった関係変数 (表、テーブル) の間の一貫性 (データ完全性) をいう。

  • 外部キー制約

関係モデルの文脈において、2つの関係変数(テーブル)の間の参照整合性制約をいう。

  • デカルト積(Cartesian product)

CROSS JOIN構文、、初めて聞いた。

デカルト積は直積とも言うやつ。2レコードのテーブルAと3レコードのテーブルBの直積なら 2 * 3 = 6通りの組み合わせとなる、、、らしい。

参考

INNER JOINとCROSS JOINの違い

  • 擬似キー(pseudo key)

シーケンス番号とか、AUTO_INCREMENTとかがそれっぽい

  • 代理キー(surrogate key)

エンティティまたはデータベース内のオブジェクトのいずれかの一意の識別子。

  • 複合キー(compound key)

複数の列で構成されたキー(A,Bの値でプライマリーになる、とか。)

  • 最後の行

MySQL・・・LAST_INSERT_ID SQL Server・・・SCOPE_IDENTITY Oracle・・・シーケンス名.CURRVAL

共通テーブル式:CTE(common table expression)

なんかこんな感じのやつ

WITH CTE_NAME
   (column_name...)
AS(
    SELECT ... FROM ... WHERE
  UNION ALL
    SELECT ... FROM ... WHERE
)
SELECT * FROM ... WHERE ...

SQL ServerとかOracle11gとかDB2とかで使えるとのこと(2013年時点)。今はどうなんだろか Oracle9iとかはSTRAT WITHとかCONNECT BY PRIORとかいう独自構文だったぽい。

モデリング的な話

交差テーブル(intersection table)

  • 2つのテーブルを参照する外部キーを持つテーブル

隣接リスト(Adjacency List)

親のidと自分のidをもつやつ。

親子関係のSELECTは簡単だが、根こそぎ拾う検索に弱く、UPDATE、INSERTには強い。 親子関係のみで完結する場合ならこれでも良いのかもしれない。

経路列挙(Path Enumeration)

/usr/local/bin的な文字列をテーブルに持たせて階層構造を表現する感じ。

これってジェーウォーク的な印象も初見では受けたのだけどどうなんだろ。 と思ったら、書いてあった。同様の弱点もあると。

便利そうだけどねぇ。

入れ子集合(Nested Set)

nsleftとnsrightで階層を表現する。

  • nsleft

そのノードより下の階層にある全てのノードが持つ値より小さい値

  • nsright

そのノードより下の階層にある全てのノードが持つ値より大きな値

nsってなんの略だろ。node startとかかな?

ツリー構造の枝のleftとrightを意識して、数値で順序性を持たせる モデリングのよう。

関係性さえ理解してしまえば、確かに使いやすそうだけど、 パッと見は難しく感じちゃうな。

利点は非葉ノードの削除を行ってもツリー構造が破壊されないこと。

一方で親子関係の特定は隣接リストよりも複雑になってしまう。 あと、ノードの挿入も複雑(ns値の再計算が必要になる) ノードの挿入が頻繁だとキツイと。

More Info!!

入れ子区間モデルなるものがあるらしい

閉包テーブル(Closure Table)

全てのパスの情報を先祖と子孫として持つやつ。 編集が簡単。ノード自体は消さなくて済む。

ただ、親子関係の参照はやや複雑になる。

主キーの必要性

  • 重複回避
  • 個別行の参照
  • 外部キー参照

気になる文献的なもの

アンチパターン本

  • Portland Pattern Repository
  • アンチパターン_ソフトウェア危篤患者の救出

例えば。。。

  • 黄金のハンマー(Golden Hammer)
  • 車輪の再発明(Reinventing the Wheel)
  • 委員会による設計(Design by Commiteee)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment