「バッジ」システムと任意の基準のデータベース アーキテクチャ (MySQL/PHP)

StackOverflow https://stackoverflow.com/questions/1049233

  •  20-08-2019
  •  | 
  •  

質問

簡単な質問:

要約すると、データベース内の既存のユーザー テーブルの構造変更を必要とせずに、無期限にバッジ ルールを作成できるようなデータベースをどのように設計するかについて、少し混乱しています。

バッジのタイトル、基準などを保存します。そのテーブルはどのようなものになるでしょうか?

  • バッジID (1)
  • バッジ_タイトル (10,000 バッジ)
  • バッジ画像 (10k.jpg)
  • バッジ基準 ([投稿数] >= 10000)
    ...

風変わりな質問:

私は自分の個人的なプロジェクトにバッジ システムを実装したいと考えていますが、そのようなことを行うのに最適な方法について少しアドバイスを求めています。ここでバッジ システムに関するいくつかの質問を読んできましたが、データベース アーキテクチャがあまり注目されていないように見えます。

ユーザーポイントに基づくバッジ (仮説の「10k バッジ」) は、非常に簡単に思えるでしょう。ユーザーの評判に影響を与えるイベント (賛成票、反対票、回答の受け入れなど) が発生すると、ユーザーの新しい評判を確認するメソッドが呼び出され、バッジが付与される可能性があります。

このシステムは非常に簡単に思えますが、少ない労力で無数のバッジを作成したいと考えている管理者にとって、データベースとしてはどのようなものになるでしょうか。その一部は単にユーザーではなく、異なる基準に基づいている可能性があります。評判。

ユーザーの評判は、ユーザー レコード自体の値である可能性があります。しかし、理想的には、新しいバッジを作成するときにユーザー テーブルに新しいフィールドを追加する必要を避けたいと思いませんか?たとえば、「Edited 100 Entries」バッジの場合、Users テーブル内に新しい列「entries_edited」を作成しませんよね。そして、エントリを編集するたびにそれを増分します...

ヒントはありますか?

スタックオーバーフローアーカイブ:


注記:バッジをユーザーに関連付ける方法を尋ねているわけではありません。バッジを授与する方法を尋ねているわけではありません(プログラムによって行われます)

役に立ちましたか?

解決

バッジの基準は任意に複雑になる可能性があることを考えると、私はあなたが「単純な」データ要素に分け、データベースのテーブルに格納することができるとは思いません。任意の複雑な基準を扱うことができる基本的に、あなたのプログラミング言語で持っているすべてのツールを再書き込みのパスダウンあなたを取るために起こっている「ルールエンジン」を書き込もうとします。

あなたが事前にわかっている場合は、バッジは、あなたのような単純なテーブルでそれらを保存することができ、(すなわち、バッジだけ評判や編集か何かの数をオフに基づいています)のみ、特定の分野に限定したい:

ReputationBadgeCriteria
  BadgeId
  BadgeName
  MinReputation

また、あなたはあなたの「ルール」を書くためにDSLのいくつかの種類を使用することができますが、あなたはまた、あなたがこれらのルールを実行するためのものとしてだけでなく、それらを読んだときに、ルールを解析するパーサを作成する必要が終わります。あなたのDSLにしたい複雑さに応じて、これは簡単な作業ではないかもしれません。これは、あなたがそれで「[レピュテーション]> 1000」や「[投稿]> 5」のようなものを持っている基準列(おそらくプレーンテキスト)を持つあなたの質問に行くされているパスのように見えます。あなたはまだそれらのルールを解析し、実行しなければならず、そうするために何かを書くことの複雑さは、あなたがそれらのルールになりたいどのように複雑に依存しています。

// thedailywtf:

私はあなたがこれらのデイリーWTF <のhref = "HTTPを読んで推薦します.COM /記事/ The_Enterprise_Rules_Engine.aspx」のrel = "noreferrer">の記事は、このアプローチは、痛みにつながる理由については、を。

他のヒント

あなたはそれで行きたいどのくらいに応じて、あなたのスキーマがかなり複雑に得ることができます。あなたが追跡する必要がある基本要素があるように私には思えるます:

Badges awarded
Points earned

非常にシンプル、これまではできますが、動的に新しいバッジや新しいポイントのカテゴリを作成することができるようにしたいです。バッジ賞は一定量まで追加することになり1点以上のカテゴリでポイントを稼ぐに依存します。だから、ポイントカテゴリ(とポイント獲得した)とバッジとの間の関係を追跡する必要があります:

Point categories
Badge categories

キーをバッジにリンクカテゴリを指すようにリンクするユーザーのポイントテーブル、だろうので。ユーザは、一つ以上のバッジに向けてポイントを獲得に貢献する特定のカテゴリでポイントを獲得できます。

badges:
badge_id
badge_name
required_points
....

point_categories:
point_id
category_name
weighting (optional)
...

point_groups:
badge_id
point_id
weighting (optional)
...

user_points:
user_id
point_id
points
...

user_badges:
user_id
badge_id
points_earned
badge_awarded (yes/no)
...

あなたの「管理者」のインターフェイスは、誰かが新しいバッジを作成し、そのバッジ(point_groups)を稼ぐために必要とされる時点カテゴリ選択できるようになります。ユーザーはポイント(user_points)を稼いたび、あなたはuser_pointsテーブルを更新し、その後、これらの点は、(point_groups)に貢献できるでしょうバッジを決定します。その後、獲得したポイントの影響を受けたバッジのためのポイントを再コンパイルし、point_earnedでuser_badgesテーブルを更新します。そして、バッジテーブルのrequired_pointsに対するuser_badgesでpoints_earnedフィールドを確認します。

あなたは別のポイントカテゴリ、または特定のバッジのためのポイントカテゴリのも、異なる重みに異なる重みを割り当てることにより、非常に手の込んだ得ることができます。しかし、この設定はバッジやポイントカテゴリの無制限の量は、テーブル構造を変更することなく、比較的簡単に作成および管理することができるようになります。

それはあなたが探しているものが完全でない場合は、

、その後、私は、少なくともタイピングたくさんの票または2を得るべきだと思います。

あなたは、それらを関連付けるために相互参照表を作成し、別のあなたの1テーブル内のユニークユーザーとユニークなバッジを追跡すると思います。

ユーザーが多くのバッジを持つことができ、バッジが多くのユーザーを持つことができます。

create table users (
id int,
name varchar
)

create table badges (
id int,
badge_name varchar
)


create table user_badges_xref (
user_id int,
badge_id int
)
ユーザーはバッジを稼いでいるかどうか影響を与える可能性があります。

統計は、サイトの運営の一部として追跡されています。そう受け入れられて答えのようなものが質問&答えを関連スキーマになります。解答と解答の所有者を表示するために、変更が行われたときは常にバッジの条件をチェックしますユーザテーブルとトリガに関係があるだろう。

  

私はどのように賞バッジをに求めていませんよ。   私は、データベース内の基準を格納する方法を求めている。

ですから、バッジはどこかのフィールドで獲得したかどうかを判断するために必要な論理演算を保存したい?

私は、基準は、ビジネスロジックの一部であるべき他のポスターに同意すると思います。そのロジックは、アプリケーション側またはトリガー内とすることができます。私はスタイルの問題だと思います。

あなたがフィールドに基準を格納するという考えには本当に結婚していた場合は、

、私は、パラメータ化されたSQLとして保存し、それを動的に実行したい。

だから、この種のものは、あなたの基準フィールドになります:

select "Badge Earned"
from all_posts 
where user_id = @user_id
having count(*) > 10000

私は、編集バッジの増分を作成しないでしょう。私はポストのnumberoはまだ編集のバッジを持っていないメンバーのために編集)(あなたがバックグラウンドで実行中のジョブを持っていると数えるべきだと思います。あなたがカウントはしたい範囲を超えていることを見ると、ユーザーがバッジを持っていることを教えてデータベースにエントリを追加します。

私はそれが他のバッジのためにほぼ同じだと思います。足すの数を制限しようとすると、直接userテーブルのバッジ情報の数を書いていません。バッジの情報が含まれており、ユーザテーブルにリンクされますテーブルを使用します。

私は簡単なことをお詫び申し上げます。

このようなシステムを実装するために、私は、ストアドプロシージャ名または特定のユーザがバッジを獲得したかどうかを決定するために使用される実際のクエリのいずれかを格納するテーブルを作成します。

badge_criteria
badge_key int
badge_criteria varchar(max)

あなたは、ユーザーが中間層から得ていないが、あなたは今後新しいバッジを追加するための任意のコードや構造的な変更を加える必要はありませんバッジのためのクエリを抽出して実行することができます。

私はこのようにそれに近づいています:すべてのバッジを格納するテーブルを作成し、1つの列の参照にバッジが授与されたかどうかを確認するために実行される機能を持っています。表はシンプルなままそのようにしてバッジを決定するロジックは、それが最も適しているコードに保つことができます。

この方法では、バッジの要件は、より複雑な依存関係を形成するために、一緒にリンクすることができます。例えば、ユーザは、このバッジを取得するために、特定の時間枠内/ W 3つの別々の、特定のバッジを受けなければなりません。

これは、データベースに行うことは不可能に近いことになるだろう - 授与バッジは、アプリケーション内のビジネスロジックで行われるべきです。そのように、あなたは(編集、訪問、評判、等)を必要とあなたが合うようには扱うことができ、すべての既存のデータを持っています。

アップデート:

あなたは、どのようにバッジが授与された場合、それはデータベースに格納されなければならないものではありません決定するルールを意味する基準によって場合。これは、テストし、維持することはほとんど不可能でしょう。

あなたが意味する場合は、例えば、「編集の数」を記憶するが、周りになって、あなたがそれを必要とする場合、そのデータを含めるために、テーブルまたはストアドプロシージャを変更する方法はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top