1

私は初心者のデータベース ユーザーです (デザイナーではありません)。postgres データベースに以下の項目を実装したいと考えています。

次の情報を含むデータベースを実装したいと思います

Table1
Classroom | Classroom Type | AV System | Student1  | Student2 | ... | Student36
1A        | 'Square'       | 1         | 'Anson'   | 'Antonie'| ... | 'Zalda'
1B        | 'Rectangle'    | 2         | 'Allen'   | 'Andy'   | ... | 'Zeth'

各生徒の座席表を保存する別のテーブルがあるため、別のテーブルを作成しました

Table2
Classroom Type | Student1 Position | Student2 Position | ... | Student36 Position
'Square'       | (1,1)             | (1,2)             | ... | (6,6)
'Rectangle'    | (1,1)             | (1,2)             | ... | (4,9)

Table3
AV System | TV          | Number of Speaker
1         | 'LCD'       | 2
2         | 'Projector' | 4

この実装の理由は、座席表を描くことです。しかし、これは良い実装ではないと思います。したがって、スケールアップしたいときにある程度の柔軟性を与える別の方法を見つけたいと思います。

前もって感謝します。

4

2 に答える 2

2

これは、リレーショナル データベースのしくみではありません。リレーショナル データベースでは、属性を繰り返さず、1:N の関係を作成します。このプロセスは正規化と呼ばれ、その主な目的の 1 つはデータの重複を防ぐことです。

私が知る限り、次の構造はあなたが望むことをします:

-- a table to store all possible classroom  types ("Square", "Rectangle", ...)
create table classroom_type
(
   type_id     integer not null primary key,
   type_name   varchar(20) not null, 
   unique (type_name)
);


-- a table to store all classrooms    
create table classroom
(
   room_id      integer not null primary key,
   room_name    varchar(5) not null, 
   room_type    integer not null references classroom_type,
   unique (room_name)
);

-- a table containing all students
create table student
(
   student_id    integer not null primary key, 
   student_name  varchar(100) not null
   --- ... possibly more attributes like date of birth and others ....
);

-- this table stores the combinations which student has which position in which classroom
create table seating_plan 
(
   student_id   integer not null references student,
   room_id      integer not null references room,
   position     varchar(10) not null,
   primary key (student_id, room_id), -- make sure the same student is seated only once in a room
   unique (room_id, position) -- make sure each position is only used once insid a room
);

ID 列に使用integerしましたが、おそらく ID 列にserial一意の値を自動的に作成するために使用したいと思うでしょう。

ほとんどの場合、学年も含めるようにモデルを拡張する必要があります。生徒のアレンは、今年は 1A の部屋にいるかもしれませんが、来年は 3C にいるかもしれません。これは、テーブルの別の属性になりseat_planます (主キーの一部になります)。

于 2013-08-29T09:25:55.290 に答える
0
|ClassRoomTypes|      |   ClassRooms   |     |   TableTypes   |    |    Tables  |
|--------------|      |----------------|     |----------------|    |------------|
|Id            |<---  |Id              |     |Id              |<-  |Id          |
|Name          |   |  |Name            |     |Name            | |--|TableType_Id|
|--------------|   ---|ClassRoomType_Id|     |Size_X          |    |------------|
                                             |Size_Y          |
                                             |----------------|

|ClassRoomToTables|       |ClassRoomToTable_Students|     |      Students     |
|-----------------|       |-------------------------|     |-------------------|
|Id               |<---   |Id                       |     |Id                 |
|ClassRoom_Id     |    |--|ClassRoomToTable_Id      | OR  |Name               |
|Table_Id         |       |Student_Id               |     |ClassRoomToTable_Id|
|-----------------|       |-------------------------|     |-------------------|

今説明:

クラスルームにはテーブルのリストがあります

テーブルにはいくつかのパラメータがあります (例: Student Capacity; Size_X, Size_Y など)

テーブルもコンセプトです(一意に識別されるものではありません。テーブルのコンセプトは多くの教室で使用されています)

1 人または複数の学生が、異なる教室の多くのテーブルに座っています (ClassRoomToTable_Students テーブル)

                                   OR

1 人または複数の生徒が特定の教室のテーブルにのみ座ることができます (ClassRoomToTable_Id from Students)

私の観点からインスピレーションを得るかもしれませんが、それがあなたのドメインケースに完全に適合することを保証するものではありません. 成功

于 2013-08-29T09:55:57.470 に答える