0

3つのエンティティがあります- articles、、journalsおよびsubscribers。データベースへのデータの保存方法に制限はありません。同じ記事を複数のジャーナルに同時に掲載することができます。

購読されているジャーナルから、発行日で並べ替えられた、繰り返しのないすべての発行済み記事を選択するにはどうすればよいですか?

最も簡単な方法:

  1. 記事を含むテーブルを作成し ます:投稿 p_id、、、、j1_idj2_idtextdate

  2. サブスクリプションを使用してテーブルを作成します: follows f_id、、(u_id —テーブルusersのユーザーIDです)u_idj_id

  3. 実行する:

クエリ例

select posts.* from posts inner join follows on (j_id = j1_id or j_id
= j2_id) where u_id = 1 order by date desc

このクエリは、重複するデータを返します。メカニズムDISTINCTまたはを使用できますGROUP BYが、重複を削除するための追加の並べ替え操作が作成されます。

もう1つの方法は、メカニズムを使用して実行できますが、。UNIONも使用しDISTINCTます。

(select posts.* from posts inner join follows on j_id = j1_id where u_id = 1)
union
(select posts.* from posts inner join follows on j_id = j2_id where u_id = 1)
order by date desc

おそらく、私は自分のやり方で間違ったストレージ構造を選択しました。

実際の質問ですが、ビッグデータに必要な時間を最小限に抑えるために、この問題について何かを行うことは可能ですか?

4

1 に答える 1

0

次のテーブル構造を使用できます

投稿:pid、テキスト、日付ジャーナル:jid、jtext journals_posts:jid、pidフォロー:fid、uid、jid

select distinct posts.* from posts 
inner join journals_posts on journals_posts.pid = posts.pid 
inner join follows on follows.jid = journals_posts.jid 
where follows.uid = <userid>

速度に注意するために、journals_posts(jid)follows(uid)にインデックスを作成できます

他のフィールドにインデックスを作成する必要がある場合があります。「explain」で、結合を使用せずにスキャンされるテーブルを確認してください。

于 2013-03-12T13:45:02.713 に答える