데이터베이스 건물에 대한"배지"시스템 및 임의의 표준(MySQL/PHP)

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

  •  20-08-2019
  •  | 
  •  

문제

퀵 질문:

요약하면,내가 조금는 방법으로 혼란 나는 디자인 이러한 데이터베이스는 불명확하지 규칙을 작성할 필요 없이 구조적 변경 내용 이전에는 기존 사용자의 테이블에서 데이터베이스입니다.

저장 배지 제목,기준,etc.무엇이라고 하는 테이블처럼 보이나요?

  • badge_id(1)
  • badge_title(10K 배)
  • badge_image(10k.jpg)
  • badge_criteria([게시물]>=10000)
    ...

호흡 질문:

실행하고 싶은데,어떻게 해야 배지 시스템 내 자신의 개인적인 프로젝트,하지만 추구하트의 조언 어떤 방법으로 최고의합니다.나는 몇 가지 질문에 대해 여기에 배지 시스템,하지만 보이지 않는 데이터베이스를 제공하고 있습니다

는 배지에 따라 사용자는-포인트(가상"10k Badge")것 같다 꽤직하고 있습니다.모든 이벤트에 영향을 미치는 사용자의 명성을(이 늦게 집에 가서 만들고,downvotes,대답을 받아 등)을 호출하는 방법을 검토하려면 사용자가 새로운 명성,그리고 잠재적으로는 수상니다.

는 시스템 소리는 매우 단순하지만,어떤 것 같으로 데이터베이스 관리자를 만들려고 수많은 양의 배지와 함께 약간의 노력을 다운로드-중 일부는 다른 기준에 따라,단지 사용자의 명성.

사용자 명성을 가능성이 높은 값에는 사용자 기록을 자체입니다.하지만 이상적으려고 하지 않는 것을 피하기 위해 추가의 새로운 필드를 사용자에 테이블을 생성할 때 새로운 배지?예를 들어"편집 100 항목에"배지 않을 새로 만들어 열"entries_edited 에서"사용자,테이블겠습니까?고 다음을 증가는 각 항목 후 편집...

Any hints?

유래 아카이브:


참고:나 요구하지 않는 방법을 연결하는 배지와 사용자.나는 어떻게 요구하는 수상 배지(즉,프로그래밍 방식으로 수행됩니다)

도움이 되었습니까?

해결책

주어지는 배지 조건을 수 있는 임의의 복잡한,나는 생각하지 않는 저장할 수 있습니다 그것은 데이터베이스 테이블로"간단한"데이터 요소입니다.쓰려고 하는 한"규칙"엔진을 처리할 수 있는 임의의 복잡한 기준에 걸릴 것입니다 당신의 경로를 아래로 기본적으로 다시 작성한 모든 도구에 있는 귀하의 프로그래밍 언어입니다.

당신이 알고 있는 경우에는 사전에 당신이 원하는 배지만 제한되는 특정한 분야(예:배지만을 기반으로 명성 또는 숫자의 편집 또는 뭔가),다음을 저장할 수 있는 사람들에 간단한 테이블과 같은:

ReputationBadgeCriteria
  BadgeId
  BadgeName
  MinReputation

또는,사용할 수있는 몇 가지 종류의 DSL 를 작성하"규칙"하지만 당신은 경험을 제공하기 위해 만들 parser 분석 규칙을 읽을 때 그들뿐만 아니라 뭔가를 실행하는 이러한 규칙이 있습니다.복잡도에 따라에서 당신이 원하는 DSL,이 되지 않을 수 있습니다 간단한 작업입니다.이와 같이 경로를 당신이 당신의 질문으로는 기준 칼럼(아마도 일반 텍스트)를 같은 것"[명성]>1000"또는"[게시물]>5"습니다.당신은 여전히 분석하고 실행하는 그 규정의 복잡성을 위해서 무언가를 쓰 그렇게 의존하는 방법에 대한 복잡한 당신이 원하는 규칙을 합니다.

을 읽 매일 WTF 에 대한 정보는 왜 이 방법을 고통으로 이어집니다.

다른 팁

얼마나 멀리에 따라 당신이 가고 싶은 그것으로,당신의 스키마를 얻을 수 있습니다.내가 보기에는 기본 요소를 추적할 필요가 있습니다:

Badges awarded
Points earned

매우 간단하다 그래서 지금까지,하지만 당신이 원하는 것을 할 수 있을 동적으로 생성하는 새로운 배지고 새로운 포인트 범주가 있습니다.배지 시상식에 따라 포인트를 적립하면 하나 이상의 지점 범주는 것까지 추가해 특정 금액입니다.그래서 당신을 추적하는 데 필요 간의 관계 종류(포인트 적립)및 배지:

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).당신이 다시 컴파일에 대한 포인트는 배지에 의해 영향을 받았 포인트 적립 및 업데이트 user_badges 테이블 point_earned.다음 확인 points_earned 분야에서 user_badges 에 대한 required_points 에 배지 테이블.

당신이 얻을 수 있는 많은 애호가를 할당하여 다른 무게를 다른 카테고리,또는 다른 무게를 위한 시점 범주에 대한 특정한 배지입니다.그러나 이 설정은 허용량 무제한 배지 및 종류를 생성 및 관리당없이 쉽게 변화하는 테이블 구조입니다.

만약 완전히 당신이 무엇을 찾고,다음 해야 한다고 생각하는 적어도 투표를 얻 또는 두 가지를 많이 입력합니다.

고유 한 사용자를 한 테이블로 추적하고 다른 배지에서 고유 한 배지를 추적 한 다음 교차 참조 테이블을 만들어이를 관련시킵니다.

사용자는 배지가 많고 배지에는 많은 사용자가있을 수 있습니다.

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

편집 배지에 대한 증분을 만들지 않을 것입니다. 백그라운드에서 작업을 실행해야한다고 생각합니다. 그리고 count () 아직 편집의 배지가 아닌 멤버에 대해 편집 된 게시물 번호를 count (). 카운트가 원하는 범위를 초과하는 것을 보면 사용자에게 배지가 있음을 알려주는 데이터베이스에 항목을 추가합니다.

나는 그것이 다른 배지와 거의 동일하다고 생각합니다. 쓰기 수를 제한하고 사용자 테이블에 배지 정보의 수를 직접 작성하지 마십시오. 배지 정보가 포함 된 테이블을 사용하여 사용자 테이블에 연결하십시오.

간단한 것에 대해 사과드립니다.

이와 같은 시스템을 구현하기 위해 저장된 프로 시저 이름 또는 특정 사용자가 배지를 얻었는지 여부를 결정하는 데 사용되는 실제 쿼리를 저장하는 테이블을 만들 수 있습니다.

badge_criteria
badge_key int
badge_criteria varchar(max)

사용자가 중간 계층에서 얻지 못한 배지에 대한 쿼리를 추출하고 실행할 수 있지만 앞으로 새로운 배지를 추가하기 위해 코드 나 구조적 변경을 할 필요는 없습니다.

나는 다음과 같이 접근하고 있습니다 : 모든 배지를 저장하는 테이블을 만들고, 배지가 수여되는지 확인하기 위해 하나의 열 참조 기능을 실행하도록합니다. 이렇게하면 테이블이 단순하게 유지되며 배지를 결정하는 논리는 코드에 적합한 코드에 보관할 수 있습니다.

이 방법을 사용하면 배지 요구 사항을 함께 연결하여보다 복잡한 종속성을 형성 할 수 있습니다. 예를 들어, 사용자는이 배지를 얻으려면 특정 기간에 3 개의 별도의 특정 배지를 받아야합니다.

이는 것은 불가능하기 위해 다음 수행에 데이터베이스-부여 배지를 수행해야에서 당신의 사업 논리입니다.는 방법은,당신은 기존의 모든 필요한 데이터(편집,방문,명예,etc.) 고 그 처리 될 수 있습니다.

업데이트:

에 의한 경우 조건을 의미하는 규칙을 결정하는 경우와 방법을 배지를 수여했다면,그 해야 하는 것이 데이터베이스에 저장됩니다.이 것이 거의 불가능을 테스트하고 유지합니다.

을 의미 하는 경우,예를 들어,저장"수의 편집"방법이 없다,주변에 점점 테이블을 수정하거나 저장 프로시저를 포함하는 데이터는 경우에 당신은 그것을 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top