2010-11-30 11 views
0

私は2つのスキーマを使用しています。スケーラビリティの高いものを選択することはできません。スキーマはQ & A用で、MySQLで構築されています。人々は質問/回答と好き嫌い/好きな質問と回答を投稿します。質問には多くの回答/好き嫌いがありますので、答えがあります。 これらの2つのスキーマのどちらがスケーラビリティに優れていますか?

は、両方のスキーマが参加し、同じ数を必要とするユーザーに質問を読むには、しかし、異なる方法で処理された結合:

スキーマ1

questions(id, title, body, userId) 
questionLikes(id, questionId, userId) 
questionDislikes(id, questionId, userId) 
quetionComments(id, questionId, body, userId) 
answers(id, questionId, body, userId) 
answerLikes(id, answerId, userId) 
answerDislikes(id, answerId, userId) 
answerComments(id, answerId, userId, body) 
favourites(id, questionId, userId) 

これは、開発が容易に、より多くの正規化されているにのために、しかしスケーラブル?繰り返し情報がたくさんあるようです。質問をつかむためにシーケンスがユーザーにある参加(私たちは彼のような/嫌いの活動を含める)

select question 
join answers 
join questionLikes 
join questionDislikes 
join questionComments 
join favouites 
join answers to answerLikes 
join answers to answerDislikes 
join answers to answerComments (multiply answer joins by number of answers) 

スキーマ2

posts(id, postTypeId, userId, title, body) 
postTypeId(id, postType) 
comments(id, postId, userId) 
votes(id, voteTypeId, userId) 
voteTypeId(id, voteType) 

これは以下の正規化とコンパクトで、それのように思えます自己ジョイントやその他の開発問題(条件付き検証)を使用して首に痛みを改善します。質問を取り込むための結合シーケンスは

select question and its answers in the same read using where @id for question, and @questionId for answers; each row, join the following: 
join votes on as likes on voteType 1 
join votes as dislikes on votetype 2 
join comments 
join favouites (multiply joins by number of rows) 

です。私は、カウントを格納するためのいくつかの追加のフィールドを追加できるので、結合は不要です。しかし、どちらも同じ数の結合を必要とし、私は私の心を構成しません。

+0

私はあなたの質問を読むのは遠くに行っていませんでしたが、なぜquestionLikesとquestionDislikesの2つのテーブルがありますか?同じ発言をスキーマにさらに適用できると思います。 –

+0

質問と回答は異なるオブジェクトであるため、同じIDを持つ可能性があります。 – Mohamad

答えて

1

私は2よりもさらに進んでいます。質問は、あなたのモデルのエンティティは何ですか?回答:ユーザーと投稿。投稿は質問、回答、投票、コメントなどが可能ですが、常にポストです。したがって

posts(id, postTypeId, userId, title, body) 
postTypeId(id, postType) 

はところで、あなたが言及選択の両方がすべてを取得(または、彼らは単に最悪の参加示すことでしたか?)。

私は自分自身が一度に彼の質問彼の答え彼のコメント ...すべてを取得見えないでしょう。どちらのユースケースにもそのようなことが必要なのでしょうか?

+0

smirkingman、ありがとう!私が意味していたのは、質問をブラウズしているユーザーのために、私はその質問を得る必要があった、それは答え、質問の好き嫌い、それぞれの答え(それらの数字は非正規化できる)でした。しかし、ユーザーがログインしていて質問/回答に投票した場合、投票した場所、質問した場所、またはその質問に属している回答を取得する必要があります。 StackOverFlowと似ているわけではありません。私はそれが理にかなったことを願う – Mohamad

+1

私が提案しているモデルでは、 "select count(*)from post innertype posttype = vote"というのは簡単です。しかし、私はまだあなたの質問に答えていないと思う。あなたが達成しようとしている結果を説明するかもしれません。あなたは「答え、質問の好き嫌い、そしてそれぞれの回答のどれを非正規化することができますか?」 – smirkingman

+0

質問/回答がどれだけ好き嫌いがあるかを表示したいのであれば、私は投稿テーブルの余分な列を使用して、コールバック経由で更新することができます。そうすれば、カウントする必要はありません。しかし、私がログインしているユーザーで、質問とその回答を見ると、以前この質問/その回答が好きか否かを知りたいかもしれません。私はQsとAs @userIdのために好き嫌いのテーブルに参加する必要があります。 (アップモード/ダウンモードのようなもの)。スケーラビリティの面では、テーブル(投稿/投票)やテーブル(質問/回答/質問好き嫌い/嫌い)のカップルのその情報を持っている方が良いです – Mohamad

関連する問題