我有一张看起来像那样的桌子
如您所见,有两个id行几乎相同:Questions
,id
。question_id
-是自动递增的,每个问题的唯一ID,id
-例如,课程1第1课有5个问题,如:问题1、2、3、4、5。课程1第二课有三个问题:1、2、3等。换句话说,这就像每个唯一的question_id
,course_id
组合的自动递增字段。我决定在lesson_id
,question_id
的基础上手动添加course_id
,以保持数据库结构的可读性,并且不会弄乱数据库,在lesson_id
值之间有一堆关联表。
第一个问题是
你认为这是个好办法吗?你是怎么设计这个数据库的?
问题是,当我想插入带有给定course-lesson-question unique id
的新问题时,course_id
字段将自动递增,但是
第二个问题
如何根据唯一的lesson_id
,id
组合获取最后的question_id
列值。例如,如果课程1第2课有3个问题:1、2、3,我想添加第4个问题(如我所说,在当前的数据库设计中,我正在手动插入course_id
值),我如何知道,课程1第2课的最后一个问题是第3个问题,并插入新的问题(最后一个数=3)++=4?
更新
情况有点复杂,但我想解释一下:
这是在线教程网站。有不同的课程,每门课程都有很多课程。现在我正在设计问答部分,在这个部分中,老师发布问题,用户得到专门的问题。
Full size image here
现在,表lesson_id
专门用于课程>基于课程的问题。question_id
-用于在问题作者和接收者用户之间创建关联。例如,admin(id=)将问题发送给id=5的某个用户。questions
-问答关联表。
最佳答案
问题1:不,我只使用问题表中的id列作为唯一标识符,并删除问题id字段。我的设计:
create table author (
id int(11) NOT NULL auto_increment,
name varchar(256)
) engine=innodb;
create table course (
id int(11) not null auto_increment,
primary key(id),
name varchar(256)
) engine=innodb;
create table lesson (
id int(11) not null auto_increment,
primary key(id),
name varchar(256),
course_id int(11) NOT NULL,
FOREIGN KEY(course_id) references course(id)
) engine=innodb;
create table question(
id int(11) not null auto_increment,
primary key(id),
question_text text,
correct_answer text,
lesson_id int(11) NOT NULL,
foreign key(lesson_id) references lesson(id),
author_id int(11) not null,
FOREIGN KEY(author_id) REFERENCES author(id)
) engine=innodb;
问题2:不要那样做。如果我有课程1,第2课和问题11怎么办?该id列将与课程id 1,第21课,问题1相同。
另外,我真的希望你用的是外键。因为上面说您使用的是mysql,所以一定要对这些表使用innodb存储引擎,这样您就可以使用外键来强制引用完整性。
高效查询该数据库、避免在假定的唯一值中发生冲突、避免将来出现严重的性能问题以及数据复制的关键是以规范化的方式设计数据库。我上面的示例是规范化的,避免了数据重复,也避免了复合密钥方案,它不会导致您在上面定义的唯一密钥。最好使用mysql内置的特性,而不是尝试重新发明轮子。
关于mysql - 需要数据库设计建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11639424/