2010-07-21 4 views
8

Planuję system osiągnięć dla strony ASP.NET MVC. Chcę, aby "reguły" osiągania były przechowywane w bazie danych - aby łatwiej było dodawać nowe osiągnięcia i centralne miejsce do zarządzania istniejącymi regułami. Użytkownicy nie będą mieli dostępu do zmiany zasad.Jak zbudować zestaw reguł opartych na DB dla systemu osiągnięć aplikacji WWW?

Gdy użytkownik wykonuje czynność, która może potencjalnie zarobić osiągnięciem, zasady db będą pytani a jeśli są mecze, dać im osiągnięcia (zapisane w tabeli przeglądowej (USERID achievementId, dateAwarded).

w tej chwili mam zamiar umieścić „wyzwalaczy” na pewnych działań w kontrolerze, ale kod, który wykonuje pracę będzie w modelu.

Czy istnieje standardowy schemat DB dla systemu osiągnięć który zezwoli na osiągnięcie Nie trzeba wymyślać koła, jeśli nie jest to konieczne, jeśli nie, jakie problemy mogą pojawić się, na co należy zwracać uwagę?

Odpowiedz

9

Pomocna może być pomocna this answer.

Mówiąc z doświadczenia, budowanie mechanizmu baz danych opartych na bazach danych w celu reagowania na działania użytkowników jest bardzo czasochłonnym, podatnym na błędy i bolesnym ćwiczeniem.

Zamiast tego możesz napisać dowolną liczbę poszczególnych zajęć, z których każda odpowiada za umiejętność przyznania jednego konkretnego osiągnięcia. Użyj klasy podstawowej lub interfejsu, aby dać im wszystkim wspólne zamówienia:

public abstract class AchievementAwarder 
{ 
    //override to provide specific badge logic 
    public abstract void Award(); 
} 

Można foreach nad każdym AchievementAwarder i nazywają Award() z ramówką. Na przykład, można mieć „100 razy” Osiągnięcia:

public class 100VisitsAwarder : AchievementAwarder 
{ 
    public override void Award() 
    { 
     //get a visit count from the db for all users 
     //award achievements 
    } 
} 

To rozwiązuje dwa problemy:

  1. rozkazy Jest wielkości prostszy, ale znacznie bardziej elastyczne, niż zasady silnika bazodanowego opartego . Jak widać, poszczególne jednostki są bardzo małe i łatwe do zmiany bez wpływu na większy system.

  2. Może być uruchamiany asynchronicznie, więc w przypadku osiągnięć, które wymagają pewnego rodzaju podnoszenia w celu ustalenia, czy powinny zostać przyznane, normalne działania użytkownika nie mają wpływu na silnik osiągnięć.

+0

@Rex M - Brzmi świetnie! Dla przykładu, który dałeś, byłby to typ wyszukiwania cron. Jak poleciłbyś zahaczyć o działania, które podejmują użytkownicy? Na przykład, publikują nową "rzecz" i jest to setna, więc daj im osiągnięcie. Załóżmy również, że może istnieć dowolna liczba osiągnięć do opublikowania nowej "rzeczy". – Chaddeus

+2

@Chad przepraszam za spóźnioną odpowiedź - aby odpowiedzieć na twoje pytanie, jak powiedziałeś, działa to najlepiej jako zadanie cron lub, w drugiej odpowiedzi, z którą się łączyłem, samoczynnie wstawiający obiekt pamięci podręcznej zainicjowany przy starcie aplikacji. Najlepszym rozwiązaniem dla wszystkich, ze względu na prostotę i wydajność, jest unikanie bezpośredniego połączenia z działaniami użytkownika, gdy tylko jest to możliwe. w wielu przypadkach znacznie lepiej jest żyć z kilkuminutowym opóźnieniem pomiędzy akcją, która popchnęła cię na drugą stronę a przyznaniem nagrody. –

+0

@ Rex M - dzięki ... jak to robi Foursquare? Nie używam go, ale kiedy użytkownik odblokowuje odznakę, dostają go od razu? A może jest nagradzany później, gdy zadanie cron się rozejdzie? Zdecydowanie podoba mi się pomysł zachowania witryny! Właśnie dostałem stronę główną do załadowania w .48 sek.: D – Chaddeus

Powiązane problemy