0

説明:

で評価システムを構築していmysql/phpます。データベースをどのようにセットアップするかについて混乱しています。

これが私の記事のセットアップです:

記事の表:

id | user_id | title | body | date_posted 

これは私の仮定の評価表です:

評価表:

id | article_id | score | ? user_id ?

問題:

user_idを評価表に載せるべきかどうかわかりません。私の計画は、次のようなクエリを使用することです。

 SELECT ... WHERE user_id = 1 AND article_id = 10

user_idしかし、 2回保存するため、冗長なデータであることはわかっています。JOINテーブルの上を把握する必要がありますか、それとも構造はそのままでよいですか?

4

3 に答える 3

2

このアプローチに問題はないと思います。1 つは評価エントリに関するもので、もう 1 つは記事の所有者に関連していると思われるため、2 回保存されているユーザー ID は特に関連性はありません。

この方法の利点は、article_id と user_id を一意にし、replace into を使用してスコアを管理することで、ユーザーごとに複数のスコアが記録されるのを防ぐことができることです。

この評価システムがゲームを防ぐためにインテリジェントである必要があるかどうかなどに応じて、これについて詳しく説明することがたくさんあります。ユーザーベースの規模など。

普通の人なら、このセットアップは比較的大規模なシステムにさえ害を及ぼすことはないでしょう。

... 半無関係:

参考までに、このスコアの重要性とゲームの側面に応じて、STDDEV() を使用して、スコア列の標準偏差を因数分解した平均を取得できます...

SELECT STDDEV(`score`) FROM `rating` WHERE `article_id` = {article_id}

正当な理由もなく特定の記事を非難したり賞賛したりするために人々が集まっているように見えるかどうかを気にかけているとすれば、それは異常値の要因となります。

于 2012-10-19T20:34:24.927 に答える
2

場合によります。記事は個々のユーザーに固有のものだと思いますか? その場合、評価テーブルに user_id を保持してから、クエリを次のように変更できます。

SELECT ... WHERE article_id = 10

また

SELECT ... WHERE user_id = 1

取得しようとしている情報に応じて。

別のテーブルのユーザーに関連付けられた一意のデータに記事をリンクするために user_id を使用するほど、「user_id を 2 回保存する」ことはありません。クエリを除いて、正しいアプローチを取っています。

于 2012-10-19T20:34:29.510 に答える
0

第 3 正規形のため、独立性を維持する必要があります。

「第 3 正規形 (3NF) は、データベースの正規化で使用される正規形です。3NF は、1971 年に EF Codd によって最初に定義されました。[1] Codd の定義では、次の条件の両方が保持される場合にのみ、テーブルが 3NF にあると述べられています。

  • 関係 R (表) は第 2 正規形 (2NF) です。
  • R のすべての非プライム属性は、R のすべてのスーパーキーに非推移的に依存 (つまり、直接依存) します。」

ソースはこちら: http://en.wikipedia.org/wiki/Third_normal_form

最初の正規形: http://en.wikipedia.org/wiki/First_normal_form

第 2 正規形: http://en.wikipedia.org/wiki/Second_normal_form

正規化とE / Rモデルを確認する必要があります。これは非常に役立ちます。

ウィキペディアでの正規化: http://en.wikipedia.org/wiki/Database_normalization

于 2012-10-19T20:31:42.080 に答える