🤖

[API技術選定3] DB選定

2023/07/29に公開

概要

API開発にDBを導入するために個人開発で利用可能なDBを選定した。

結論

AWS DynamoDBを使う。

理由

小規模のサービスでは普通にRDSを使うとラーニングコストの大半がDBの運用維持費になるはず。
OracleやMySQLを使うとなるとどのDBも値段がとっても高い!月数千円は余裕でかかる。
以下の記事がとてもまとまっている。完全同意。
https://laiso.hatenablog.com/entry/nope-sql

なので今回はSQLを捨ててAmazon DynamoDBを利用する。
https://aws.amazon.com/jp/dynamodb/

SDKはguregu/dynamo

GoからDynamoDBにアクセスする方法はguregu/dynamoを利用する。以下の記事が
https://future-architect.github.io/articles/20220601b/#DynamoDBアクセスにAWS-SDK-for-Goを生で使う必要はなかったのでは

DB接続

sess := session.Must(session.NewSession())
db := dynamo.New(sess, &aws.Config{Region: aws.String("us-west-2")})
table := db.Table("Widgets")

データ定義

type widget struct {
	UserID int       // Hash key, a.k.a. partition key
	Time   time.Time // Range key, a.k.a. sort key

	Msg       string              `dynamo:"Message"`    // Change name in the database
	Count     int                 `dynamo:",omitempty"` // Omits if zero value
	Children  []widget            // List of maps
	Friends   []string            `dynamo:",set"` // Sets
	Set       map[string]struct{} `dynamo:",set"` // Map sets, too!
	SecretKey string              `dynamo:"-"`    // Ignored
}

select

// 以下のSQL(Oracle)と同義
// SELECT
//    UserID
// FROM
//    TABLE
// WHERE
//    Time = w.Time and
//    rownum < 1
var result widget
err = table.Get("UserID", w.UserID).
	Range("Time", dynamo.Equal, w.Time).
	One(&result)

select All

var results []widget
err = table.Scan().All(&results)

insert

w := widget{UserID: 613, Time: time.Now(), Msg: "hello"}
err := table.Put(w).Run()

https://github.com/guregu/dynamo

GitHubで編集を提案

Discussion