0

次のケースでMysqlデータベースをどのように扱うかについて混乱していますが、この件に関する他の解決策をいくつか調べました。

学校では、子供たちはクラスごとにグループ分けされます。たとえば、最小クラスは 5 年生、2 番目は 6 年生、というように、最後のクラスは 8 年生です。各クラスには約 20 人の生徒がいて、生徒数は各学年で約 100 人であるため、いくつかのクラスが形成され、クラスを一意に識別するために識別子が使用されます (例: 5 年生のクラス: 5A、5B、5C、5D、 5E) . 毎年、クラスは次の段階的なグレードに進みます。したがって、5 番目のクラスは 6 番目のクラスになります。

データベース設計のアイデア/ヒントを教えてください。

4

2 に答える 2

0

可能であれば、どこでも明示的なデータが好きです。たとえば、個別のグレード(5、6、7、8など)フィールドとグレードID(A、B、Cなど)フィールドを作成します。これには多くの利点があります。例えば:

  • すべての5年生のクラスをクエリしても、範囲クエリは発生しませんSELECT * FROM table WHERE grade LIKE "5%";
  • 同じこと:フルスキャンなしですべての「B」クラスを簡単にクエリできます(適切なインデックスがある場合)

もう1つは、クラスは毎年増加するということです。5Bは6B、次に7Bになります。そのため、探しているクラスを見つけるのが非常に難しくなります。私はフィールドでスタートを作成します。2006年に開始されたクラス「B」を見つけるのは簡単で明示的です(ここでも明示的なもの:))

私の推奨事項は次のとおりです。

CREATE TABLE school_class (
id smallint unsigned NOT NULL AUTO_INCREMENT,
start_in smallint unsigned NOT NULL,
grade tinyint unsigned NOT NULL,
grade_id CHAR(1),
PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE student (
id mediumint unsigned NOT NULL AUTO_INCREMENT,
class_id smallint unsigned NOT NULL,
name VARCHAR(255),
PRIMARY KEY (id),
FOREIGN KEY (class_id) references school_class(id)
) ENGINE=InnoDB;
于 2012-09-28T15:21:47.720 に答える
0

学生(Students)用に1つのテーブル、クラス(Classes)用に1つのテーブルを作成し、それらをsay...classIdにリンクします。グレードはそのテーブルの主キーではないため、1年が経過すると、classIdを変更してグレードを更新できます。

mysql> create table Classes (classId int, grade varchar(5), primary key(classId));
Query OK, 0 rows affected (0.00 sec)

mysql> create table Students (studentId int, name varchar(30), classId int, primary key(studentId), foreign key (classId) references Classes(classId));
Query OK, 0 rows affected (0.01 sec)
于 2012-09-28T13:37:21.917 に答える