web-dev-qa-db-ja.com

子供たちが読むことを訓練するウェブアプリのデータベース設計

問題は私のデータベース設計についてです。大丈夫ですか?

2つのWordTrainingテーブルとSyllableTrainingテーブルを別々にすること、およびデザインが単純すぎる(正規化があまり進んでいない)ことに不快に感じます。多分他の問題があります。

私のウェブアプリは子供たちに音節と単語を読むことを教えています。

最初にユーザー(子供)が選択します-音節を読むように訓練するか、単語(全体)を読むように訓練するか。

次に、ユーザーが固定リスト(WordBankSyllableBankの表の下にあります)から単語/音節を提示されます。ユーザーが読み取り演習に失敗した場合、アプリは次回同じ質問を繰り返します。増加する時間間隔で定期的に再度尋ねます。ユーザーが単語/音節を初めて表示し、最初の試行で読み取り練習に合格した場合-この単語/音節はユーザーに二度と表示されません(ユーザーがすべての単語を練習できる特別なCramモードを除いて)彼の以前のテスト結果に関係なく、データベースから)。

私は60 000語/ 300音節/〜10 mlnユーザー以下を期待しています。

私のデータベース設計は次のとおりです。

WordBank
+----+-------+------------------+
| id | Word  | SyllabilizedWord |
+----+-------+------------------+
|  1 | hello | hel/lo           |
|  2 | papa  | pa/pa            |
+----+-------+------------------+

SyllableBank
+----+----------+
| id | Syllable |
+----+----------+
|  1 | hel      |
|  2 | lo       |
+----+----------+

WordTraining
+----+--------+------------+---------------+--------+--------+--------+
| id | Failed |  NextRep   | FirstSeenDate | Ignore | WordId | UserId |
+----+--------+------------+---------------+--------+--------+--------+
|  1 | True   | NULL       | 2020-02-26    | False  | 1      | 1      |   
|  2 | True   | 2020-02-30 | 2020-02-26    | False  | 4      | 2      |
|  3 | False  | NULL       | 2020-02-26    | False  | 7      | 3      |
+----+--------+------------+---------------+--------+--------+--------+

SyllableTraining
+----+--------+------------+---------------+--------+------------+--------+
| id | Failed |  NextRep   | FirstSeenDate | Ignore | SyllableId | UserId |
+----+--------+------------+---------------+--------+------------+--------+
|  1 | True   | NULL       | 2020-02-26    | False  | 1          | 1      |   
|  2 | True   | 2020-02-30 | 2020-02-26    | False  | 4          | 2      |   
|  3 | False  | NULL       | 2020-02-26    | False  | 7          | 3  | 
+----+--------+------------+---------------+--------+------------+--------+

User
+----+---------------+------------+--------------+---------+---------------+
| id |   LoginName    |  FullName  |    Email     | PswHash | LastLoginDate |
+----+---------------+------------+--------------+---------+---------------+
|  1 | johnLoginName | John Black | [email protected] | acb3456 | 2020-02-22    |
+----+---------------+------------+--------------+---------+---------------+

WordTrainingテーブル-ユーザー(Wordトレーニングモードをクリックした(選択した)をクリックしたユーザー)に初めてWordが表示されると(最初に表示されます)、レコードが作成されます。 WordIdは、テーブルWord(実際に使用できるすべての単語)の(主キー)と一致する外部キーです。UserIdは、それぞれのユーザーの外部キーです。 Ignore atributeは、ユーザーがそれぞれのWord(それを使って運動)をこれ以上見たくないことを意味します。

WordBank.SyllabilizedWord-単語を正しく音節化する方法をプロンプトに表示するだけです。

より詳細なアプリロジック:

  1. 複数のユーザーがいます
  2. ユーザーごとにいくつかのトレーニングモードがあります(単語全体を読み上げる、音節を読み上げる、3番目のモードは説明が複雑)
  3. ユーザーごとに、統計情報を保存します-Wordまたは音節のIDがユーザーに表示されました(少なくとも1回)+ユーザーが失敗したか、合格したかどうか+ユーザーがそのような問題を示した日付。

アルゴリズム

  1. ユーザーがログイン
  2. ユーザーがモードを選択(音節または単語のトレーニング)。将来的には、異なるモードが追加されるか、初期モードが頻繁に変更される可能性があります。
  3. ユーザーが[次の問題]ボタンをクリックしたときのアプリの最初の起動時、新しい(まだ表示されていない)問題がユーザーに表示されます。彼は答え、問題(それぞれの単語または音節)が合格または失敗としてマークされます。プラスFirstSeenDateテーブルフィールド(WordTrainingまたはSyllableTrainingテーブル-ユーザーが何を練習したかによって異なります)が設定されています(ユーザーがこの問題を見たISO日付)。
  4. ユーザーが[次の問題]ボタンをクリックしたときのアプリの2回目の起動時、問題の選択は次のようになります:失敗した問題がある場合-最初にすべて表示します。失敗した問題がない場合-まだ目に見えない問題を表示します。失敗(前のゲームで)問題がこの間に渡された場合、問題は「合格」とマークされ(Failはfalse)、フィールドNextRep(次の繰り返し(レビュー))が設定されます( ISO日付を使用して、ユーザーにその問題をもう一度表示します)フィールドNextRepは2 *(todayDate-FirstSeenDate)に設定されていますが、このアルゴリズムは変更される可能性があり、非常に複雑になる可能性があります。
  5. ユーザーが[次の問題]ボタンをクリックしたときのアプリの3回目の起動時-今日(または今日より前)にNextRepがある場合-最初にすべて表示します。その後、ロジックは上記の項目4のようになります(失敗したものはすべて表示され、その後表示されません)。 NextRep問題が渡された場合、フィールドNextRepは新しい値に設定されます= 2 *(todayDate-(current)NextRep)--このアルゴリズムは変更される可能性があり、非常に複雑になる可能性があります。
1
Code Complete

WordIdUserIdの組み合わせは一意であるようです。これを複合主キーとして使用し、Id列を削除できます。代わりに(他の理由でIDが必要な場合)、インデックスとの一意の組み合わせを強制できます。どちらの方法でもデータをクリーンに保つことができ、クエリを追加して重複を作成していないことを確認する手間が省けます。

また、単語と音節のテーブルはほとんど同じです。それらをBankTrainingに組み合わせ、新しいフィールドを使用して、それが単語か音節かを示すことができます。これにより、記述する必要のあるクエリの数、および関連するバグを半減させることができます。また、フレーズや文などを処理するようにシステムを拡張することも簡単になります。OTOH将来、単語ではなく追加のフィールドが必要になるが音節は必要ない場合、問題になる可能性があります。

1
Robin Bennett

達成しようとしている目的のために、データベースは正常に機能します。

冗長なデータは表示されません(これは正規化の要件の1つです)。

WordTrainingおよびSyllableTrainingは、テストされている単語/音節とユーザーを参照しているため、その部分は正しいです。

全体的に、それは良いデザインです。

1
user92101