0

私は学習ツールを構築していますが、データベースを構築するための最善の方法がわかりません。

基本的に、私は約50000ビットの情報を含むシンプルで大きなテーブルを持っています。

情報(50'000行)

id info_text

ユーザー

ID名メールパスワードなど

私が望んでいるのは、生徒が各項目に学習済みまたは学習済み(基本的にオンとオフ)のマークを付けて、改訂時に各項目にチェックマークを付けることができるようにすることです。

何千人ものユーザーに対応するツールを構築したいと考えており、データベースと関連するクエリを設定するための最も効率的で簡単なオプションの方法を考えていました。

現時点では、2つの主キーを持つ1つの巨大なテーブルを持ち、1つはユーザーID、次に調査した情報のIDを持ち、ある種のJOINステートメントを実行することで、彼らが残したアイテムのみを引き戻すことができます。勉強。

ユーザー情報

user_id info_id

前もって感謝します

4

2 に答える 2

0

私はこのようなことをします:

1)uid主キーを持つユーザーテーブル

2)(uid、cid)の主キーを持つ登録済みテーブル(このテーブルには、学生が登録されているすべてのコースが表示されます)

3)itemidの主キーを持つ、調査するすべてのアイテムを保持するアイテム(情報)テーブル

次に、登録されたテーブルに1つの属性(バイナリフラグ)があります。1はそれが調査されたことを意味し、0はまだ調査する必要があることを意味します。

于 2012-06-26T19:35:12.947 に答える
0

この状況をモデル化する1つの方法は次のとおりです。

ここに画像の説明を入力してください

中央のテーブルには、USER_IDとITEM_IDに複合主キーがあるため、個別に一意である必要はありませんが、2つの組み合わせは一意である必要があります。

  • ユーザー(指定されたUSER_IDを持つ)は、STUDIEDテーブルに対応する行(これらの同じUSER_IDとITEM_ID値を持つ)がある場合にのみ、特定のアイテム(指定されたITEM_IDを持つ)を調査しました。
  • 逆に、STUDIEDの対応する行が欠落している場合に限り、ユーザーはアイテムを調査していません。特定のユーザーが学習していないすべてのアイテムをプルするには、次のようにします。

    SELECT * FROM ITEM
    WHERE NOT EXISTS (
        SELECT * FROM STUDIED
        WHERE
            USER_ID = <given_user_id>
            AND ITEM.ITEM_ID = STUDIED.ITEM_ID
    )
    

    または、代わりに:

    SELECT ITEM.*
    FROM ITEM LEFT JOIN STUDIED ON ITEM.ITEM_ID = STUDIED.ITEM_ID
    WHERE USER_ID = <given_user_id> AND STUDIED.ITEM_ID IS NULL
    

このデザインの良いところは、事前にSTUDIEDテーブルを気にする必要がないことです。新しいユーザーまたはアイテムを追加するときは、STUDIEDをそのままにしておきます。後でユーザーが学習を進めるにつれて、徐々にそれを埋めていきます。

于 2012-06-26T20:13:30.763 に答える