2010-05-08 4 views
1

저는 약간의 웹 기반 게임을 만들고 있으며 SQL 데이터베이스의 기본 데이터의 무결성을 검사하는 로직을 어디에 둘 것인지 결정해야합니다.포인트 시스템 관계를 유지 관리하기위한 db의 논리는 무엇입니까?

각 사용자는 자신에게 할당 된 점수를 추적하고 점수는 다양한 작업으로 부여됩니다. 개인별 보상 수준이 시간에 따라 변동하기 때문에 각 작업 트랜잭션에 대한 기록을 보관하여 반복되지 않도록하고 완료 시점의 작업 값을 추적합니다.

내 스키마는 지금까지 다음과 같습니다

create table player (
    player_ID   serial primary key, 
    player_Points  int not null default 0 
); 

create table task (
    task_ID    serial primary key, 
    task_PointsAwarded int not null 
); 

create table task_list (
    player_ID   int references player(player_ID), 
    task_ID    int references task(task_ID), 
    when_completed  timestamp default current_timestamp, 
    point_value   int not null, --not fk because task value may change later 
    constraint pk_player_task_id primary key (player_ID, task_ID) 
); 

는 그래서, player.player_Pointstask_list에서 자신의 모든 누적 작업 점의 총 수 있어야합니다.
이제 로직을 어디에 적용해야합니까?
전체 점수를 알고 싶을 때마다 player.player_Points을 삭제하고 쿼리를 수행해야합니까? 내가 게임의 과정에서 많은 질문을 할 것이므로 낭비되는 것 같습니다.

task_list에 트리거를 넣으면 자동으로 player.player_Points가 업데이트됩니까? 데이터베이스에 너무 많은 논리가 있고 응용 프로그램에서이 관계를 유지해야합니까?

감사합니다.

답변

0

관계형 관점에서 보면 player.player_Points를 사용하지 않기 때문에 데이터 무결성에 대해 걱정할 필요가 없습니다. 이것이 너무 많은 성능 부담이라면, 당신은 그것을 비정규화할 수 있지만, 앱에 스트레스 테스트를 해보고 조기에 최적화 할 필요가없고 아주 간단한 쿼리를 얻을 수 있습니다. 값 (논리적이지만 데이터베이스 작업 부하 관점에서도).

개인적으로 비정규 화 된 경로를 사용하더라도 방아쇠를 사용하지 않겠지 만 개인 편견 일뿐입니다. 아마도 삽입/업데이트/삭제를 수행 할 때마다 모든 것이 올바르게 업데이트되는지 확인하기 위해 일부 통합 테스트를 설정하고, 문제가 의심되는 경우 주기적으로 실행할 수있는 쿼리를 저장할 수 있습니다.

task_list에 points_value를 저장할 필요가 없도록 작업에 daterange를 추가하는 것도 고려해 볼 수 있습니다.

0

실제로 트리거 제안이 가장 좋습니다. 그것은 방아쇠 또는 제약 조건을 사용하여 앱에서 계산 한 합계를 확인할 수도 있지만, 계산 작업을 앱에 추가해야하는 이유는 무엇입니까?).

관련 문제