2012-11-19 3 views
0

현재 사용자의 최고 점수 만 저장하는 MySQL 테이블 설정이 있습니다. 그들이 더 좋은 점수를 얻으면 이전 점수가 업데이트됩니다. 마지막으로 24 시간 이내에 게시 된 점수 만 보여주는 24 시간 리더 보드를 갖고 싶습니다.결과 페이지로 돌아 가기 사용자의 최고 점수

두 가지 옵션이 마음에 와서 :

1) 각 리더 2 개 별도의 테이블을 가지고. 사용자 당 1 점만 저장하는 "Best Score"리더 보드와 사용자 당 1 점을 저장하고 시간을 기록하는 "24 시간"리더 보드. 즉, 점수를 제출할 때마다 1 대신 2 테이블로 보내야하지만 데이터 풋 프린트는 다음 옵션에 비해 최소화됩니다.

2) 사용자 당 중복 점수를 게시 할 수있는 표가 1 개 있고 시간 기록에 점수가 표시되며 필요한 데이터 (점수가 가장 좋음, 24 시간 내에 점수 등) .

아이디어가 있습니까? 이것은 내가 PHP/MySQL을 다루었을 때 처음 이었기 때문에 최선의 접근 방식이 설계/효율성 측면에서 무엇인지 확실하지 않습니다.

+0

별도의 로직을 구분해야하므로 첫 번째 디자인 원칙을 명확하게 이해해야합니다. 또한 다른 보드를 건드리지 않고도 한 보드를 재 설계/제거/변경할 수 있습니다. – arkascha

+0

왜 이럴 수 있니? 이것은 점수 유지 측면에서 악몽입니다. 사용자가 다른 스코어 보드를 추가하기로 결정하면 어떻게됩니까? 그런 다음 자신의 프로그램에 논리를 추가해야합니다. 그것은 모든 의견을 정상화 된 상태로 데이터베이스 수준에서 유지해야합니다. – Lock

답변

2

정규화 된 데이터베이스의 경우 모든 점수에 대해 1 개의 테이블 만 가져야합니다. 삽입, 업데이트 또는 삭제 만해서는 안됩니다.

예를 들어 최대 점수를 찾으려면 MAX을 쿼리에 적용하면됩니다.

지난 24 시간 이내에 점수를 찾고 싶다면 WHERE 절에이를 추가 할 수 있습니다.

+0

이것이 결국 내가 한 일입니다. 또한 항목 수에 따라 총 몇 개의 게임이 재생되는지 보는 이점이 있습니다. –

0

최고의 점수를 보유한 테이블이 하나만있는 것이 좋습니다. 당신의 문제에 대한 두 개의 테이블이의

일부 단점은 다음과 같습니다

  • 아마도 당신은 테이블 사이에 조인해야합니다 정보를 제공하기 위해 (이하 확대됨에 정규화 된 테이블이 있음)
  • 코드는 덜 읽을 수 있어야하고 덜 유지할 수 있습니다.
  • 일관성을 유지하려면 트랜잭션을 사용하여 두 항목을 모두 업데이트해야합니다.

하나의 테이블 만 사용하면 쿼리에서 사용할 필드에 인덱스를 만들어 리더 보드 24를 표시해야합니다. 즉, 후보 인덱스는 WHERE 절에 사용될 타임 스탬프가됩니다.

+0

최고 점수 만 저장하면 문제는 점수가 제출 된 날짜를 타임 스탬프에 표시하므로 가장 좋은 시간을 게시 한 후 24 시간이 지나면 24 시간 리더 보드에서 점수를 얻지 못할 것입니다. 그 시간 동안 경기했다. –

관련 문제