問題は私のデータベース設計についてです。大丈夫ですか?
2つのWordTraining
テーブルとSyllableTraining
テーブルを別々にすること、およびデザインが単純すぎる(正規化があまり進んでいない)ことに不快に感じます。多分他の問題があります。
私のウェブアプリは子供たちに音節と単語を読むことを教えています。
最初にユーザー(子供)が選択します-音節を読むように訓練するか、単語(全体)を読むように訓練するか。
次に、ユーザーが固定リスト(WordBank
とSyllableBank
の表の下にあります)から単語/音節を提示されます。ユーザーが読み取り演習に失敗した場合、アプリは次回同じ質問を繰り返します。増加する時間間隔で定期的に再度尋ねます。ユーザーが単語/音節を初めて表示し、最初の試行で読み取り練習に合格した場合-この単語/音節はユーザーに二度と表示されません(ユーザーがすべての単語を練習できる特別な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
-単語を正しく音節化する方法をプロンプトに表示するだけです。
より詳細なアプリロジック:
アルゴリズム
FirstSeenDate
テーブルフィールド(WordTraining
またはSyllableTraining
テーブル-ユーザーが何を練習したかによって異なります)が設定されています(ユーザーがこの問題を見たISO日付)。Fail
はfalse)、フィールドNextRep
(次の繰り返し(レビュー))が設定されます( ISO日付を使用して、ユーザーにその問題をもう一度表示します)フィールドNextRep
は2 *(todayDate-FirstSeenDate)に設定されていますが、このアルゴリズムは変更される可能性があり、非常に複雑になる可能性があります。NextRep
がある場合-最初にすべて表示します。その後、ロジックは上記の項目4のようになります(失敗したものはすべて表示され、その後表示されません)。 NextRep
問題が渡された場合、フィールドNextRep
は新しい値に設定されます= 2 *(todayDate-(current)NextRep)--このアルゴリズムは変更される可能性があり、非常に複雑になる可能性があります。WordId
とUserId
の組み合わせは一意であるようです。これを複合主キーとして使用し、Id
列を削除できます。代わりに(他の理由でIDが必要な場合)、インデックスとの一意の組み合わせを強制できます。どちらの方法でもデータをクリーンに保つことができ、クエリを追加して重複を作成していないことを確認する手間が省けます。
また、単語と音節のテーブルはほとんど同じです。それらをBank
とTraining
に組み合わせ、新しいフィールドを使用して、それが単語か音節かを示すことができます。これにより、記述する必要のあるクエリの数、および関連するバグを半減させることができます。また、フレーズや文などを処理するようにシステムを拡張することも簡単になります。OTOH将来、単語ではなく追加のフィールドが必要になるが音節は必要ない場合、問題になる可能性があります。
達成しようとしている目的のために、データベースは正常に機能します。
冗長なデータは表示されません(これは正規化の要件の1つです)。
WordTrainingおよびSyllableTrainingは、テストされている単語/音節とユーザーを参照しているため、その部分は正しいです。
全体的に、それは良いデザインです。