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 关系。此过程称为规范化,其主要目标之一是防止数据重复。

据我所知,以下结构可以满足您的要求:

-- 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
);

我用于integerID 列,但很可能您可能希望使用它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|
|-----------------|       |-------------------------|     |-------------------|

现在解释一下:

教室有一张桌子列表。

有一些参数(例如:学生容量;Size_X、Size_Y 等)

桌子也是一个概念,(它不是唯一标识的东西,许多教室都使用桌子概念)

一名或多名学生坐在不同教室的多张桌子旁(ClassRoomToTable_Students 表)

                                   OR

一个或多个学生只能坐在特定教室的一张桌子旁(来自学生的 ClassRoomToTable_Id)

您可能会从我的角度得到一些启发,我不保证完全适合您的领域案例。成功

于 2013-08-29T09:55:57.470 回答