fujithuro / expensesBook

自分用の家計簿Webアプリケーションです。サーバーサイドはある程度仕上がっていますがフロントはまだまだ未完成です。
0 stars 0 forks source link

データ管理方法(RDBMS)の再検討 #6

Open fujithuro opened 3 months ago

fujithuro commented 3 months ago

現状と課題

現状は、使い慣れていることもあってPostgreSQLでデータの管理をしている。 ただ、それだとAWSなどにデプロイした際、それなりの金額がかかることを懸念している。

代替案

正直、下記の要件を考えると本格的なRDBMSを使う必要はまるでなく、SQLiteなどでも問題ないのでは?と考えている 「まずは稼働することを目指す」という意味では、最初は現状のままでもいいのだが、 お金が絡むことでもあるので、あまり突っ走らず、ちゃんと考えたい。

参考ページ 【AWSを使おう!】EC2にSQLiteでデータベースを構築しよう!: https://uniuni-diary.com/aws-sqlite/ AWSで爆安サーバレスRDBを構築する (個人開発向け): https://zenn.dev/nixieminton/articles/dc041d5bc8c09f


2024/08/19 追記

以前は、外出先など(主に飲食店)で出費を記録できるようにしたかったので、「まずは稼働することを目指す」というスタンスだった。 しかし今はGoogleフォームの利用により外出先での記録が実現できているので、変に焦る必要はない。 SQLiteに変える方向で進める。

fujithuro commented 2 months ago

テーブル構成の変更について

SQLiteで扱えるデータ型には限りがある https://www.sqlite.org/datatype3.html

そのため、下記の既存のDDLは変更する必要がある。

CREATE TABLE 費目マスター (
    費目cd INTEGER PRIMARY KEY NOT NULL,
    費目名 TEXT NOT NULL,
    有効区分 BOOLEAN DEFAULT true NOT NULL
);

CREATE TABLE 出費履歴 (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
    支払日 DATE NOT NULL,
    費目cd INTEGER NOT NULL,
    金額 INTEGER NOT NULL,
    支払先 TEXT NOT NULL,
    使途 TEXT NOT NULL,
    最終更新者id INTEGER NOT null,
    最終更新日時 TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (費目cd) REFERENCES 費目マスター(費目cd)
);

要変更点

UUID型は使えない

型にUUIDはなく、UUIDを自動生成する関数もない。 型はTEXTに変え、UUIDの生成はKotlinで行うのが良さそう。

DATE型やTIMESTAMP型は使えない

日付や時刻を扱うための型はない。 方法としては下記の3パターンがあるようだが、計算はしないので文字列で持っていれば十分

BOOLEAN型は使えない

型にBOOLEANはない。 型をINTEGERに変えて、0 or 1 で管理する。 Booleanへの変更はKotlinの中で処理する。

変更後

これらの変更点を踏まえ、ChatGPTに出してもらったのが下記のSQL。 ざっと見た感じでは問題なさそうだが、動作確認はできていないので、あくまで参考情報として。

CREATE TABLE 費目マスター (
    費目cd INTEGER PRIMARY KEY NOT NULL,
    費目名 TEXT NOT NULL,
    有効区分 INTEGER DEFAULT 1 NOT NULL
);

CREATE TABLE 出費履歴 (
    id TEXT PRIMARY KEY NOT NULL,
    支払日 TEXT NOT NULL,
    費目cd INTEGER NOT NULL,
    金額 INTEGER NOT NULL,
    支払先 TEXT NOT NULL,
    使途 TEXT NOT NULL,
    最終更新者id INTEGER NOT NULL,
    最終更新日時 TEXT DEFAULT CURRENT_TIMESTAMP NOT NULL,
    FOREIGN KEY (費目cd) REFERENCES 費目マスター(費目cd)
);
fujithuro commented 2 months ago

SQLiteの導入

導入にあたっては、依存関係を加えたうえで、設定を追加すれば良さそう

build.gradle.kts

implementation("org.xerial:sqlite-jdbc")

application.yml

spring.datasource.url=jdbc:sqlite:path/to/your/database.db
spring.datasource.driver-class-name=org.sqlite.JDBC

そのうえで、DDLなどの実行をするにはコマンドラインツールが必要そうなので、Homebrewでインストールする

brew install sqlite