データベース関連の似て非なる用語

データベース（特に RDB）周辺では誤解を招きやすい似て非なる用語がいくつかあります。

以前にこんなツイートをしたことがありました。

https://x.com/abe_masanori/status/1637611492827865090

ほとんどネタ記事ですが、本記事で少し説明を加えたいと思います。（最後におまけとして完全なネタも）

# 「リレーション」と「リレーションシップ」は違う

RDB 界隈でよく誤用されますが、

- リレーション
    - 複数のラベルからなる見出しと、0 個以上のラベルに対応した値の組からなる集合のこと。
    - 雑に言うとテーブルやビューのこと。（PostgreSQL でテーブル名を間違えると ```relation does not exist``` というエラーメッセージが表示されるのはこのことから）
        - ただし、厳密には SELECT 文の結果や中間結果などもリレーション。
    - 日本語だと「関係」と訳されることが多い。
- リレーションシップ
    - ２つリレーション（テーブルやビュー）などの間に定義された関係性。
    - 雑に言うと参照整合性制約で定義された 2 つのテーブル間の関係性のこと。
    - 日本語だと「関連」と訳されることが多い。

正直、単独で「リレーション」を使うケースってそれほど多くはないと思うのですが、「リレーショナル・データベース」など組み合わせて利用されるケースは多いため、本来はリレーションシップのところをリレーションと誤用されるケースは多いですね。

# 「空文字列」と「空白文字列」は違う

- 空文字列
    - 英語で empty string。
    - 長さ 0 の文字列。
    - SQL文字列リテラルで書くと ```''```。
- 空白文字列
    - すべてスペース文字（U+0020）で埋められた文字列。
    - SQL 文字列リテラルで書くと ```'     '```（スペース文字を 5 個連続しているが Qiita の都合で 1 つしか表示されない）。
    - 昔のシステムにおいて、固定長文字列型のカラムに何も設定されていないことを表すために使われることが多い。

名前に「空」という文字が入っていることから、非技術者（または非 DB 技術者）と話す場合はよく混乱が見られます。私は誤解を避けるために昔に空文字列のことを「長さ 0 の文字列」と呼んでいたけど、結局伝わりづらいのでやめた。

あと、Oracle では

- 空文字列と NULL を区別しない（他の DBMS は大体区別する）
- JDBC において CHAR 型カラムの空文字（NULL）と空白文字列が異なる（確か設定で変更は可能）

などは様々な混乱の元になるので、そろそろやめてほしい。

# 「リストア」と「リカバリ」は違う

厳密に用語の定義があるわけではないので、私の意見も多分に含むのですが、

- リストア
    - バックアップからファイルを戻すこと。
    - ファイルを戻すという行為以上のものではない。
- リカバリ
    - 正常な状態に復旧させること。
    - 単に行為を指しているというより、目的（正常な状態に復帰させる）を達成するための行為という意味が強い。

Oracle ではメディア障害（データファイルなどの破損など）が発生した場合に、

1. バックアップメディアからバックアップファイルを戻す。
1. アーカイブログ/REDO ログファイルを適用してロールフォワードする。
1. 未コミットのデータ変更をロールバックする。

という流れで内部では復旧をします。この際、リストアは 1. の行為を、リカバリは 1.～3. の全体の行為（＋正しく復旧されたかの確認）をリカバリと呼ぶような気がします。（もちろん復旧要件がバックアップ取得時点のデータに戻すことであれば、リストア = リカバリになります）

# 「DB」と「DBMS」は違う

- DB（データベース）
    - 本来の意味は組織だって編成され、効率よく検索や更新ができるデータの集合。
    - データベース界隈では、データが保存されたストレージやフォーマット、ストレージ上のデータを検索・更新するためのプロセス群をまとめてデータベースと呼ぶ。
- DBMS
    - データベース管理システム（Database Management System）。
    - データベースを実現するためのソフトウェアのことを指す（データ自体は含まない）。

なので、正確には「DB ベンダー」（ORACLE社やMicrosoftなど）は「DBMSベンダー」だろうという気はしますが、まぁそれぐらいは寛容に受け入れた方が良いと思っています。

ただ、Oracle においては「DBインスタンス」と「DB」は明確に区別しておかないと Real Application Clusters を理解できないので注意が必要です。

# 「SQL」と「SQL文」は違う

- SQL
    - Structured Query Language
    - データベースの操作（定義、更新、参照など）を行う言語（文法やその意味など）のことを指す。
- SQL 文
    - SQLで記載された実際のステートメント

まぁ、この誤用も寛容に受け入れるべきかと思っています（「日本語を書いていました」も許されますし）。

しかし、SQL 文でデータを操作するアプリケーションを開発していたことを指して「SQL 作ってました！」と言われると「お前は ISO の SQL 標準化策定に関わっていたのか？」と言いたくなる気持ちも分からなくはないです。

# 「同時接続数」と「同時実行数」は違う

- 同時接続数
    - 一般には DB クライアントから DB サーバーに何本の接続が同時に張られているか。
- 同時実行数
    - クエリが何本同時に実行されるか。

たまにデータベースの性能要件で、「同時接続数 ? 本（もしくは 同時実行数 ? 本）の負荷に耐えられること」みたいな文言がありますが

- コネクションプール前提であることが多い中で、同時接続数に何の意味があるのか？
- クエリが同時に実行されるかなんてアプリやネットワークの待ちもあるし、同時実行数ってどうやって目安を出したの？

と思うことが多いです。大体、同時にアプリを使っているユーザー数のことが多いですが、なら最初からそう言ってほしい。

# おまけ
## 「ORACLE」と「Oracle」と「oracle」と「オラクル」は違う

- ORACLE：Oracle Corporation（アメリカに本社を構える会社）
- Oracle：ORACLE社が提供する製品
- oracle：OS ユーザー名やディレクトリ名などに利用
- オラクル：日本オラクル株式会社

と若いころに習ったんだけどなぁ。今は ORACLE 社自身があまりこだわっていないっぽい。

## 「Db2」と「DB2」は同じ

DB2 は[2017年6月、「Db2」にリブランドした。](https://ja.wikipedia.org/wiki/IBM_Db2#%E5%90%8D%E7%A7%B0)

## 「SQL Server」と「MSSQL」は同じ

「SQL Server というのかい？贅沢な名だね。今からお前の名前は MSSQL だ。」

## 「Sybase AES」と「Sybase IQ」は違う

SAP に買収されて名前は変わっているかもしれませんが、

- Sybase AES：OLTP 向けの DBMS
- Sybase IQ：DWH 向けの DBMS

たまに、「現行システムは Sybase が利用されている」と聞くと、どっち？となるやつです。