データベースの基本的な用語
テーブル
- データを行と列で整理した、表形式のもの
ID | 名前 | 年齢 | メールアドレス |
---|---|---|---|
1 | 田中太郎 | 30 | taro@example.com |
2 | 鈴木花子 | 25 | hanako@example.com |
レコード
- テーブルの1行にあたるデータ
フィールド
- テーブルの列にあたる項目
主キー(Primary key)
- レコードを一意に識別するためのフィールド
- 重複が許されない
- 上記テーブルの「ID」フィールド
データベースの種類
リレーショナルデータベース(RDB)
- データをテーブル(表)の形式で管理
- 関係(リレーション)を使ってデータを関連付けられる
- SQLで操作する
- MySQL、PostgreSQL、SQLiteなど
非リレーショナルデータベース(NoSQL)
- データを表形式以外の方法で管理
- 柔軟でスケーラビリティが高い
- ドキュメント形式やキーバリュー形式でデータを保存
- MongoDB(ドキュメント型)、Redis(キーバリュー型)
インメモリデータベース
- データをメモリ上に保存し、高速な読み書きを実現
- Redis、Memcached
SQL
※サンプルはMySQLの例です。
DDL
新しいテーブルの作成
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
age INT,
email VARCHAR(255) UNIQUE
);
テーブルの変更
ALTER TABLE users ADD COLUMN phone_number VARCHAR(15);
テーブルの削除
DROP TABLE users;
テーブルのデータを全削除(テーブル構造は維持)
TRUNCATE TABLE users;
データベースの作成
CREATE DATABASE sample_db;
データベースの削除
DROP DATABASE sample_db;
DML
データの追加
INSERT INTO users (id, name, age, email) VALUES (1, '田中太郎', 30, 'taro@example.com');
データの取得
SELECT * FROM users WHERE age > 25;
データの更新
UPDATE users SET age = 31 WHERE id = 1;
データの削除
DELETE FROM users WHERE id = 1;
DCL
ユーザーに権限を付与
GRANT SELECT, INSERT ON users TO 'example_user'@'localhost';
ユーザーの権限を取り消し
REVOKE INSERT ON users FROM 'example_user'@'localhost';
ユーザーの作成
CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'password';
ユーザーの削除
DROP USER 'example_user'@'localhost';
データベース設計の基本
正規化
- データの重複を排除し、構造を整理するプロセス
- 複数のテーブルに存在する共通項目を別テーブルに分離して共通化する
インデックス
- 検索速度を向上させるための仕組み
- 本の「索引」と同じような役割
Goサンプルコード
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3" // SQLite用ドライバ
)
func main() {
// データベースに接続
db, err := sql.Open("sqlite3", "./example.db")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// テーブルの作成
createTable := `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
email TEXT UNIQUE
);
`
_, err = db.Exec(createTable)
if err != nil {
log.Fatal(err)
}
// データの挿入
insert := `INSERT INTO users (name, age, email) VALUES (?, ?, ?);`
_, err = db.Exec(insert, "田中太郎", 30, "taro@example.com")
if err != nil {
log.Fatal(err)
}
// データの取得
rows, err := db.Query(`SELECT id, name, age, email FROM users;`)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
user := struct {
ID int
Name string
Age int
Email string
}{}
rows.Scan(&user.ID, &user.Name, &user.Age, &user.Email)
fmt.Printf("ID: %d, Name: %s, Age: %d, Email: %s\n", user.ID, user.Name, user.Age, user.Email)
}
}