2013-04-24 5 views
7

SZCZEGÓŁYKtóre podejście jest najlepsze dla przechowywania listę słów w MySQL, które będą później wykorzystywane do celów statystycznych?

Mam quiz (nazwijmy to quizem1). Quiz1 używa tej samej listy słów za każdym razem, gdy jest generowany. Jeśli użytkownik potrzebuje, można je pominąć słowa do zakończenia quizu. Chciałbym przechowywać te pominięte słowa w mysql, a następnie wykonać na nich statystyki.

Początkowo miałem zamiar przechowywać nieodebrane słowa w jednej kolumny jako ciąg znaków. Każde słowo zostanie oddzielone przecinkiem.

|testid |  missedwords      | score  | userid | 
************************************************************************* 
| quiz1 | wordlist,missed,skipped,words   | 59  | 1  | 
| quiz2 | different,quiz,list     | 65  | 1  | 

Problem z tego podejścia jest to, że chcę pokazać statystyki na koniec każdego quizu o której słowa były najczęściej pominięte przez użytkowników, którzy wzięli quiz1.
jestem przy założeniu, że przechowywanie nieodebranych słowa w jednej kolumnie, jak wyżej jest nieefektywne w tym celu, jak bym trzeba wyodrębnić informacje, a następnie zgadzają się - (prawdopodobnie tally użyciem PHP-chyba że rejestrowane dane przechowywane w osobnej tabeli).

Wówczas pomyślałem, że być może muszę utworzyć oddzielny stolik dla pominiętych słów. Zaletą poniższej tabeli jest to, że powinno być łatwo dopasować słowa z poniższej tabeli.

|Instance| missed word  | 
***************************** 
| 1 | wordlist  | 
| 1 | missed   | 
| 1 | skipped   | 

Innym podejściem mogę utworzyć tabelę z tallys i aktualizować każdy quiz1 czas została podjęta.

Testid | wordlist| missed| skipped| otherword| 
************************************************** 
Quiz1 |  1 |  1|  1| 0  | 

Problem z tym podejściem polega na tym, że dla każdego quizu potrzebowałbym innej tabeli, ponieważ w każdym quizie będą używane różne słowa. Również informacje są tracone, ponieważ tylko dane są przechowywane, a nie powiązane dane, które użytkownik pominął które słowa.

Pytanie

Które podejście byłoby użyć? Czemu? Alternatywne podejścia do tego zadania są mile widziane. Jeśli zauważysz jakieś błędy w mojej logice, możesz je wskazać.

EDIT Użytkownicy będą mogli odzyskać quizu tyle razy, ile chcą. Ich informacje nie będą aktualizowane, zamiast tego dla każdego quizu, który odtworzyli, zostanie utworzona nowa instancja.

+0

Najwyraźniej 'testid' brakuje w tabeli z' brakującym słowem'. Jeśli celowe przedstawienie pytania nie zostało celowo zmniejszone, najpierw sprawdź bazy danych, SQL. –

+0

Czy pominięte słowa muszą być powiązane z konkretnymi użytkownikami, czy przechodzisz do bardziej anonimowych statystyk? (w swoich propozycjach używasz dwóch metodologii, więc może być potrzebne dodatkowe wyjaśnienie.) – Jon

+0

Chciałbym zachować jak najwięcej informacji, więc chciałbym zachować nieodebrane słowa związane z konkretnym użytkownikiem. Później planuję pokazywać użytkownikowi indywidualne statystyki (lub przynajmniej mieć możliwość późniejszego opracowania). – TryHarder

Odpowiedz

3

najlepszym sposobem, aby zrobić oznacza to, że zbiór słów jest całkowicie znormalizowany. W ten sposób analizy będą łatwe i szybkie.

quiz_words with wordID, word 
quiz_skipped_words with quizID, userID, wordID 

Aby uzyskać wszystkie pominiętych słów użytkownika:

SELECT wordID, word 
FROM quiz_words 
JOIN quiz_skipped_words USING (wordID) 
WHERE userID = ?; 

Można dodać grupę o klauzuli mieć liczbę grup tego samego słowa.

Aby uzyskać zliczania określonego słowa:

SELECT COUNT(*) 
FROM quiz_words 
WHERE word LIKE '?'; 
+0

+1 fajne podejście :) – Stephan

1

Zgodnie z database normalization theory drugie podejście jest lepsze, ponieważ idealnie jedna komórka tabeli relacyjnej powinna przechowywać tylko jedną wartość, która jest atomowa i nie do podsortowania. Każde słowo jest instancją podmiotu.

Również mogę zasugerować nie tworzyć Quiz-Word tabel, ale zastrzega innej kolumny w tabeli Missed-Word quizie, dla których słowo to zostało określone, a następnie użyć tej kolumny jako klucz obcy dla Quiz tabeli. Wtedy prawdopodobnie może uniknąć generowania tabel w czasie rzeczywistym (co jest „złe praktyki” w projektowaniu baz danych).

1

dlaczego nie ma tabeli quizu i tabeli quizów, tabela quiz_words przechowuje id, quizID, słowo jako kolumny. Następnie dla każdej instancji quizu tworzyć rekordy w tabeli quiz_words dla każdego słowa użytkownik nie wykorzystać.

Następnie można uruchomić liczy mysql na stole quiz_words oparciu o quizID i lub rodzaj quizu

1

najlepszym rozwiązaniem (z mojego POV) za to, co chcesz przez to osiągnąć jest znormalizowana aproach:

  • test tabela, która ma test_id kolumnę i innych kolumn
  • missed_words tabela, która ma id (AI PK) i word (UQ) tutaj można też hits kolumny, które powinny być zwiększany za każdym razem, że skojarzenie z tym słowem jest wykonany w test_missed_words tabeli W ten sposób masz statystyk, które mają być już skompilowane i nie trzeba im być obliczone z kwerendy wybierającej
  • test_missed_words który jest stół link, który ma test_id i missed_word_id (PK composite)

W ten sposób nie ma danych nadmiarowych (nieodebrane słów) i można wyodrębnić z łatwością, że statystyki, które chcesz

1

Utrzymanie jak najwięcej informacji jak to możliwe (i jest w stanie skompilować statystyk specyficzne dla użytkownika później, jak również ogólne statystyki teraz) Chciałbym stworzyć strukturę tabeli podobny do:

    Stats 
quizId | userId |  type| wordId| 
****************************************** 
1  |  1 | missed|   4| 
1  |  1 | skipped|   7| 

Gdzie type może być albo int określające różne rodzaje działań lub reprezentację ciąg - w zależności od jeśli wierzyć może kiedykolwiek być więcej. ^^

Następnie:

 Quizzes 
quizId | quizName| 
******************** 
     1| Quiz 1| 

Z listy Słowo dla każdego quizu jak:

 WordList (pk: wordId) 
quizId | wordId| word| 
*************************** 
     1 |  1 | Cat| 
     1 |  2 | Dog| 

Trzeba tabelę user jednak chcesz, jesteśmy po prostu łącząc id od niego w tym systemie.

Dzięki temu wszystkie pola id będą nieunikalnymi kluczami w tabeli stats. Gdy użytkownik pomija lub pomija słowo, należy dodać id tego słowa do tabeli stats wraz z odpowiednimi quizId i type. Uzyskiwanie statystyk w ten sposób ułatwiłoby to jako podstawa per-user, podstawa per-word lub per-type - lub kombinacja tych trzech.Dzięki temu lista słów do każdego quizu będzie również łatwo dostępna do tworzenia quizów. ^^

Mam nadzieję, że to pomoże!