Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use PostgreSQL instead of MongoDB #4572

Merged
merged 393 commits into from
Apr 7, 2019
Merged

Use PostgreSQL instead of MongoDB #4572

merged 393 commits into from
Apr 7, 2019

Conversation

syuilo
Copy link
Member

@syuilo syuilo commented Mar 23, 2019

Summary

PostgreSQLにするなどしています

Resolve #4534
Resolve #3510
Resolve #4203
Resolve #4018
Resolve #2497
Resolve #2797
Resolve #3209
Resolve #3079
Resolve #2275
Resolve #2341
Resolve #4299
Resolve #3921
Resolve #2789
Resolve #4504
Resolve #1540
Resolve #4471
Resolve #4335
Close #1432
Close #1036
Close #1405
Close #4385
Close #4377

  • 削除系の処理が強化された
    • 例えば投稿を削除したらその投稿への返信やRenoteも削除され、その投稿への返信やRenoteに対する返信やRenoteも削除され... と連鎖し、関連するすべての情報がリンクして削除される
  • IDを生成するときに投稿日時を考慮するようにした
    • これで古い投稿がタイムラインの先頭に出てくるなどの問題が修正される
  • MongoDB固有機能のGridFSが使えなくなったことに伴い、オブジェクトストレージを使用しない場合、ドライブのファイルはサーバーのファイルシステム上に保存するように
  • ユーザーリストに追加されているユーザー情報はユーザーリストに配列として埋め込むのではなく、新たにUserListJoiningテーブルを作りそこで管理するように
    • これでユーザーが削除されたとき自動でリストからも削除されることになる
  • ピン留めされている投稿情報はユーザーに配列として埋め込むのではなく、新たにUserNotePiningsテーブルを作りそこで管理するように
    • これで投稿が削除されたとき自動でピン留めからも削除されることになる
  • アンケートは別テーブルに分離
    • 個々の選択肢にIDを割り当てるのはやめて、選択肢配列のインデックスをID代わりにするように
  • インスタンスのブロック情報はインスタンスレコードではなくMetablockedHostsプロパティに保存するように
    • 今まではいったん連合してからでないとブロックできなかった
  • ユーザーのpublicKeykeypairは別テーブルに分離
    • ほとんどの部分で必要とされないのでSELECTで無駄になる
  • ホームのカスタマイズ情報はブラウザに保存するように

@syuilo
Copy link
Member Author

syuilo commented Mar 23, 2019

力尽きそう

}
};

function sanitize(str: string): string {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自作のサニタイズ関数は漏れがあったときに怖いのでプレースホルダを使うべき

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほど
プレースホルダについて調べたけどなんらかのライブラリを使うこと前提で実際にSQLがどうなるかがわからなかった

Copy link
Contributor

@rinsuki rinsuki Mar 24, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

だいたいは

SELECT * FROM hoge WHERE fuga=? AND piyo=?

db.prepare(sql_text).execute([1, 2])

で呼び出すと

SELECT * FROM hoge WHERE fuga=1 AND piyo=2

になる (他にも{"hoge": 1}:hogeで参照できたり$nで配列の特定のところを参照できたりするやつもある)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

db.prepare(sql_text).execute([1, 2]) というのはSQLじゃないから自前で実装するのかな

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

だいたいの場合DBとやりとりしてくれるクライアントに入ってる

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ふーむ、そうするとその関数はこのライブラリの外なので型定義が使えなくなっちゃいそう

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SQL文を作るときは[string, any[]]を返して、あとはラッパーで頑張るとよさそう

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

他のライブラリ見てみたけど自前でエスケープ処理書いてた(しかもめっちゃシンプルだった)
https://github.com/sequelize/sequelize/blob/master/lib/sql-string.js#L71

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wish Github had a translate button ;-;

@rinsuki
Copy link
Contributor

rinsuki commented Mar 24, 2019

SQL文ビルダー、便利そうなのでライブラリに切り出してnpmで公開してくれると他のプロジェクトでも使えてありがたい

@syuilo
Copy link
Member Author

syuilo commented Mar 25, 2019

JSON型の特定のキーの値をインクリメントする方法がわからない

@syuilo
Copy link
Member Author

syuilo commented Mar 25, 2019

起動するようにはなった

################################################################
#[ PostgreSQL configuration ]###################################

db:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

v11以降では

db:
  type: postgresql

みたいな感じにして、v10は

db:
  type: mongodb

に変更する(互換性は維持)とかにした方が綺麗そう。

@syuilo
Copy link
Member Author

syuilo commented Mar 26, 2019

アカウント作れるようになった

@syuilo
Copy link
Member Author

syuilo commented Mar 26, 2019

投稿できるようになった

@syuilo syuilo added the ☢️Breaking This change breaks compatibility label Mar 27, 2019
@syuilo
Copy link
Member Author

syuilo commented Apr 7, 2019

投稿作成の処理が複雑になっているので各種ストリームに流す処理を削除
その代わり一つの投稿ストリームにだけ流すようにして、各種ストリームのチャンネルがそれを受け取って各々で必要な投稿をフィルタリングするようにした

@syuilo
Copy link
Member Author

syuilo commented Apr 7, 2019

ストリーミングのテスト追加

@syuilo syuilo merged commit f0a2972 into develop Apr 7, 2019
@syuilo syuilo deleted the pg branch April 7, 2019 12:51
@poVoq
Copy link

poVoq commented Apr 20, 2019

Any chance for MySQL support as well?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment