2017-07-08 8 views
1

私はディスカッションフォーラムがある場所にウェイトを持っています。すべての質問には固有のIDがあり、回答には質問IDを参照する外部キーを持つ一意のIDもあります。upvote/downvoteのデータベース設計(英語)はディスカッションフォーラムにありますか?

私がログインしているユーザーを持っている。AJAXを使用して、私は(、、upvote/downvoteユーザー名をQID/AID)のデータを送信することができます.But、いくつかの問題があります。

  1. ユーザーがログインするたびに、彼が質問を開いたときに、以前のupvotesとdownvotesを表示する必要があります。

  2. ユーザーが同じ質問をdownvote /複数回upvoteすることはできません。彼が+1する質問をアップvしたように、彼はそれを下降させるだけで、それをもう一度upvoteすることはできません。

私に従った解決策。私はusernameがプライマリキーで、別の属性が彼がやったすべてのupvotesとdownvotesのリストであるテーブルを維持することを考えています。例:ユーザーがログインするたびに

(username, array) 
(baqir, up_A001 up_A050 down_Q011 up_Q123) 

、私はこの配列を取り、そのままでは利用者の以前のすべてのupvotesとdownvotesがあることを確認してください。新しい投票がある場合は、それを配列に追加します。

もっと良い解決策はありますか?

P.S.必要ではなく、現在のデータベース構造。

class Question(models.Model): 
    QID = models.CharField(default="",max_length=1000, primary_key=True) 
    title = models.CharField(max_length=30, default="") 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=6, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 

class Answer(models.Model): 
    AID = models.CharField(max_length=1000, default="", primary_key=True) 
    QID = models.ForeignKey(Question,on_delete=None) 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=6, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.AID 

私はDjangoを使用しています。そして、私は基本的に質問と回答の投票に実装されたstackoverflowが何であれ欲しいです。

+0

あなたは単にquestionid/answer idとuseridにユニーク制約を設定しますか? – chris85

+2

Pythonの質問にPHPでタグを付ける人がますます増えています。なぜか分からない。 – apokryfos

+0

あなたは、(QID/AID、username)を属性として持つ別のテーブルを作成することを意味しますか? –

答えて

1

どのような配列の人々、何を話していますか? Q/Aごと、またはユーザーごとに別のテーブルを作成するか、2つのもの、つまりユーザーとQ/Aとキーを繰り返すことができるテーブル(このテーブルにはプライマリキーなし)をリンクするテーブルを作成します。 配列のようなものは時間とエネルギーを失い、とにかく良いDBデザインルールに反しています。

票保つ表の例:だからあなたは彼/彼女が投票し、各質問や答えを各ユーザーに接続

Table votes: 
    UID | QID | AID | VOTE 

を。 QIDまたはAIDはNULLにすることができます。あなたが何らかの質問に出くわしたら、あなたはテーブルの投票に何か言いたいことがあるのか​​、それに結びついている答えがあるのか​​をチェックするだけです。現在のQIDとUIDが一致し、結果が得られれば、それに応じて行動します。

これは、多くのユーザーを持っている場合、低速である可能性がありますが、基本的にいい仕事します。

第2の解決策は、(アップ/ダウンがそれを投票)何かをしただけのユーザーが別のテーブルの維持とあなたの質問/回答を結びつけることです。これはDBの見た目をより奇妙に見せますが、あなたのユーザがQとその答えを出すときに、このテーブルに訪問者についての何かがあるかどうかをチェックするだけです。私は、私は繰り返し、十分に明確各Qあたりの新しいテーブルおよび/またはA.

ないです場合は、すなわち、逆に同じ技術を適用することができますユーザーが投票したすべてのQ/Aを保持するテーブルにユーザーを接続します。これは、おそらく注文と効率を維持する最良の方法です。だから、ユーザーが任意のQページに来るたびに、そのQの履歴があるかどうかをチェックします。

いいえ、ナンセンスはありません。現在表示されているQ/Aのステータスを確認するための1つの追加リクエスト。

1

upvoteとdownvoteのシナリオは、コードを使用して処理することができます。最後の投票がupvoteにのみ許可されている場合、downvoteにのみ権限があり、upvoteへの権限を持ちますが、配列内にあります。

0

Dalenによって提案された最初のアプローチは、最高の

が票を保存するための別のテーブルを作るようで、ユーザーが以前に任意の同様の作用を行っている場合は任意のアップ/ downvoteのアクションを実行する前に、確認してください。

の対処を行う前に、アクションを実行した場合は、前のテーブルのエントリを削除/無効にして新しいエントリを作成します。 そして既に質問のためと同じアクションを実行している場合は、アップ/ダウンボートが既に説明されているので、何もしないでください。

このようなタスク用のテーブルを作成することは、タスクを簡単にするだけでなく、より多くの柔軟性を提供するため、各行動にタイムスタンプを追加したり、質問AnswerVotesため

0
CREATE TABLE QuestionVotes (
    UID ..., -- User id 
    QID ..., -- Question id 
    vote ENUM('up', 'down'), 
    PRIMARY KEY(QID, UID) -- for finding voting status of a question 
    INDEX(UID, QID) -- if you need the votes by a user 
) ENGINE=InnoDB; -- to get benefit of clustered PK 

同上で行わ総アクションを見つけるために、テーブルの上にクエリを数えます。

Upvote/downvote:行が存在するかどうかを確認し、存在しない場合は行を作成します。行が存在する場合は、行を削除するか、ユーザーが2回アップ/ダウンしていると不満を言います。

アレイを使用しないでください。あまりにも痛いものになるでしょう。

Djangoが複合PRIMARY KEYを持つことができない場合は、Djangoを放棄します。

テーブルに1000文字のキーがありません。ディスク容量とパフォーマンスが低下します。

ユーザーは6文字しか使用できません。大きなスケーリングについて楽観的ではない?

関連する問題