データベースの概念・特性
カテゴリー: #リスキリング
kuboshoのアンラーニング・リスキリングの2日目は「データベース」を取り扱う。
ここではデータベースの概念・特性のみ扱う。
概要
データを集めて一元管理するためのもの
データモデル
データ間の相互関係を表した図
相互関係を整理するのがデータモデリング
DDD文脈でドメインモデリングってあったなあ
関係データモデル・階層データモデル・ネットワークデータモデルといったモデル群が存在する
関係モデル(関係データモデル)はEdgar F. Coddという人が考案した
「Codd's 12 rules」というDBMSをrelationalたらしめるルールがある
関係モデル以外のモデルを実装したデータベースの実例があまり思い浮かんでいない
NoSQL(Redis、MongoDB、Bigtableなど)はどうなんだ……?
キー
primary keyは一意(ユニーク)であり、複数使えない。NULLも入れられない
複合主キー(composite primary keys)というのもあるようだ
2つの列を組み合わせてprimary keyに設定するパターン
フレームワークのドキュメントに出てくる
Composite primary keys | Django documentation | Django
Active Record の複合主キー - Railsガイド
unique keyは列(attributes)に対して複数設定できる。NULLは重複して入れられるDBMSもある
メールアドレス・電話番号あたりに設定しておくのがいい
foreign keyは他のテーブルに定義されているkeyを参照する
日本語の一部技術記事や、いちばんやさしい 基本情報技術者 絶対合格の教科書+出る順問題集には、参照先テーブルのprimary keyを指定しないといけないと書いているけど、PostgreSQLのドキュメント見る限りではそうではないはず。あくまでデフォルトがPKであるという認識
If the refcolumn list is omitted, the primary key of the reftable is used. Otherwise, the refcolumn list must refer to the columns of a non-deferrable unique or primary key constraint or be the columns of a non-partial unique index.
https://www.postgresql.org/docs/18/sql-createtable.html
MySQLのドキュメント内でもNDBではユニークキーまたはプライマリキーと書いてあった
NDB always requires an explicit unique key (or primary key) on any column referenced as a foreign key.
参照一貫性(Referential Integrity)を保つ必要がある
参照先のデータにレコードが存在しない場合は参照一貫性がなくなる
DBMSではだいたいエラーになることが多い?
なぜデータベースが必要なのか
データを一元管理して扱いやすくするため
(RDBMSにおいては)テーブル間をforeign keyを使って参照することで、テーブル間に関係性が生まれる
実例
RDBMS
PostgreSQL
MySQL
SQL Server
SQLite
まとめ
TODO
関連リンク
[データベース設計編]参照整合性制約機能を多用してはいけない | 日経クロステック(xTECH)
【PostgreSQL版】INDEXチューニング入門 #index - Qiita
対数も学ばないとなあ……
O(log n) みたいなBig O notationは雰囲気で掴みとっている
関連するかもしれない雑多なメモ
Which is best data type for phone number in MySQL and what should Java type mapping for it be? - Stack Overflow
回答に電話番号のデータ型は可変長(VARCHAR)の文字列(String)で扱えとあった
住所と同じくいろんなフォーマットがあったり、非数値の文字列「+」が含まれたり、望ましくないフォーマット調整や先頭の0が削除されてしまったりするためとのこと
非数値の文字列という意味では「-」も含むなあ
SQLiteはサーバーを必要としないことを知った
SQLite - Wikipedia
Over 2 million tests are run as part of a release's verification. The SQLite library has 156,000 lines of source code, while all the test suites combined add up to 92 million lines of test code.
200万の自動テストが動いて、テストコードも含めると9200万行になるのはえぐい
本体のコードは156,000行なんだ