web-dev-qa-db-ja.com

リレーショナルデータベースを備えたWebアプリケーション-ベストプラクティス?

私は現在、Twitterに非常に似ているが、私の会社にいくつかのユニークな機能を備えたWebアプリケーションを設計しています。テクノロジーはVue2、Spark frameworkおよびPostgreSQLです。

ERの設計方法と、クライアント側をAPIと統合する方法を決定しようとしています。問題を分解しましょう。

これらは、アプリケーションの主要コンポーネントである「Tweet」の詳細です。
Id、
タイムスタンプ、
投稿タイプ(別のテーブルから)、
TaggedPeople(別のテーブルのユーザーIDのリスト)、
テキスト、
ステータス(別の表から)、
いいね(別のテーブルのユーザーIDのリスト)、
追加データ(投稿タイプに応じて)

フィードにこれらのつぶやきの束を表示し、つぶやきを追加/更新/削除し、さまざまなパラメーターでつぶやきをフィルター処理する必要があります。

現在、私は3つのオプションの間で引き裂かれています:

  • クエリを他のテーブル(タイプ、ユーザー、ステータス)と結合します。
  • すべての外部キーをJSONB列に非正規化します(私はPostgreSQLを使用しています)。
  • キーを使用してデータを返し、クライアント側で実際のテキストを「結合」する-Vuex(Vueの状態管理ツール)にプリロードされたデータを使用します。

この種のWebアプリケーションの経験者からの声はとてもクールです。

前もって感謝します。

2
JacobKreynin

モデル、ビュー、コントローラーを分離する必要があります。

データベース層(モデル)については、ツイートとピープルのクラスを作成します。そして、タグ用の結合テーブル(2つの列、tweetIdとuserId)と、いいね!用の結合テーブル(これも、tweetIdとuserIdの2つの列)を作成します。投稿のタイプやステータスなどは単なるルックアップ値なので、別のテーブルは必要ない場合があります。
「追加データ」を解析またはインデックス付けせずにデータベース内で検索できるように、並べ替えとフィルタリングに必要なものは、独自の列に分離されている場合に最適です。通常、データベースの呼び出しは、最適化とスケーリングを行うのに最適な場所です。データベースの機能を活用できる場合は、すべてを1つの列にまとめてクライアントで解析するだけではありません。

次に、データをアプリケーション(コントローラー/ビュー)にロードするときに、キー値を持つマップを使用するなど、好きなようにデータを渡したり結合したりできます。それはあなたの好みのフレームワークに依存します。

1
user3749223