# データベースについて

このリポジトリは、PS BoardのQAQC結果を主に管理するデータベースを扱ってる。

```@contents
Pages = ["index.md"]
Depth = 4
```

!!! info
    - 簡易結果閲覧アプリの使い方は[Simple result viewer](./howtouse-simpleviewer.md)にあります。
    - データベース本体の使い方に関するチュートリアルは[Tutorial](./tutorial.md)にあります。

## データベースの特徴

現時点(2024-09-13)でQAQC試験は[Google Sheetsで作成したデータベース](https://docs.google.com/spreadsheets/d/128qOseOy4QDotehYe4Wf2jj88tnwiXGVdR3NHrjcDYU/edit)でデータが管理されているが、主にデータを統合して参照するときに手作業が多く必要となり、エラーが発生する問題があった。
そこで[リレーショナルデータベース](https://ja.wikipedia.org/wiki/関係データベース)の形式にすることでより体系的にデータを扱えるようにしたのがこのリポジトリである。

データベースは[SQLite](https://www.sqlite.org/index.html)で実装されており[^1]、軽量かつ様々な手段によるアクセスが可能となっている。

[^1]: Why SQLite?: (クライアント・サーバーの形式ではなく)Cライブラリであるという点でシンプルでありながら、れっきとしたRDBMSであり、[非常に多くの場所で使われている](https://www.sqlite.org/mostdeployed.html)(例えばブラウザの履歴やブックマーク管理)。依存も少なく([SQLite is a Self Contained System](https://www.sqlite.org/selfcontained.html)にあるが、C stdlibのうち10個ほどしか使用しない)、気軽に使うことができる。

## アクセス方法
データベースはファイルとして存在するので、そのファイルにアクセスできればよい。[^2][^3]
ファイルは _TODO_ で手に入る。

データベースを読み書きするためにはライブラリが必要で、問い合わせは[SQL](https://ja.wikipedia.org/wiki/SQL)によって行うが、ラッパーを使うこともできる。
以下に使いやすいであろうライブラリ/パッケージを列挙する。[^4]

- [sqlite3(コマンドラインプログラム)](https://www.sqlite.org/cli.html): 公式の提供するCLI。どこでも動く。CSVでのエクスポートもできる。
- [DB Browser for SQLite](https://sqlitebrowser.org): クロスプラットフォームなデスクトップアプリケーション。最も簡単。
- [Python sqlite3](https://docs.python.org/ja/3/library/sqlite3.html): Pythonの標準ライブラリ。すなわち(C)Pythonが入ってるならたいてい入っている。
- [SQLite Viewer Web App](https://sqliteviewer.app/), [beta版](https://beta.sqliteviewer.app/psboard_qaqc.db/table/qaqc_runs): ブラウザで動く。最も手軽。
- [SQLite.jl](https://github.com/JuliaDatabases/SQLite.jl/tree/master): Juliaのパッケージ。[Tables.jl](https://github.com/JuliaData/Tables.jl)準拠なため、[DataFrame](https://github.com/JuliaData/DataFrames.jl)やCSVに/から変換できる。 _この実装で用いられている。_
- [SQLite Studio](https://sqlitestudio.pl): デスクトップアプリケーション。
- [ROOT TSQLFile Class](https://root.cern.ch/doc/master/classTSQLFile.html): ROOTのTFile派生クラス。[チュートリアル](https://root.cern.ch/doc/master/group__tutorial__sql.html)

他にも[diesel](https://diesel.rs)や[SQLAlchemy](https://www.sqlalchemy.org)のようなORM、C/C++, tcl(いずれも[公式のチュートリアル](https://sqlite.org/quickstart.html)に載っている)、[LuaSQLite3](http://lua.sqlite.org/index.cgi/index)、[ODBCドライバ](http://www.ch-werner.de/sqliteodbc/)とODBCでアクセスできるソフト([LibreOffice Base](https://www.libreoffice.org/DISCOVER/BASE/)や[Microsoft Access](https://support.microsoft.com/ja-jp/topic/odbc-データ-ソースを管理する-b19f856b-5b9b-48c9-8b93-07484bfab5a7))でもアクセスできる。

[^2]: 大抵の関係データベース(たとえばPostgres)はサーバーでホストし、TCPでアクセスする
[^3]: [sqlsync](https://github.com/orbitinghail/sqlsync)によるオンラインアクセスやRESTサーバーなどによるアクセスの案もある
[^4]: このようなプログラムはいくらでもある

## データベースの構造
![db structure](./assets/sqlite-db.svg)

四角がテーブル、その中にコラム、線でつながっているのが*FOREIGN KEY*制約を表している。

データベース作成SQLは`src/sql/create_table.sql`にある。

