我是新手数据库用户(不是设计师)。我想在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
这种实施的原因是制定座位计划。但是我不认为这是一个很好的实现。因此,我想找到另一种方法,当我想扩大规模时,它会给我一些灵活性。
提前致谢。
答案 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)
从我的观点来看,你可能会得到一些灵感,我不保证完全适合你的域名案例。成功