如何实现灵活的表

时间:2013-08-29 09:18:27

标签: database postgresql

我是新手数据库用户(不是设计师)。我想在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

这种实施的原因是制定座位计划。但是我不认为这是一个很好的实现。因此,我想找到另一种方法,当我想扩大规模时,它会给我一些灵活性。

提前致谢。

2 个答案:

答案 0 :(得分: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
);

我使用integer作为ID列,但很可能您可能希望使用serial自动为其创建唯一值。

很可能该模型需要扩展到包括学年。因为学生艾伦今年​​可能在1A室,但明年在3C。这将是seat_plan表的另一个属性(并且将成为主键的一部分)

答案 1 :(得分: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|
|-----------------|       |-------------------------|     |-------------------|

现在解释一下:

Class Room 有一个表格列表。

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

表格这是一个概念,(它不是唯一标识的,在许多教室中使用表概念)

一个或多个学生坐在不同课堂的许多桌子上(ClassRoomToTable_Students表)

                                   OR

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

从我的观点来看,你可能会得到一些灵感,我不保证完全适合你的域名案例。成功