[英]How do I create this database?
我正在尝试开发一个英文应用程序,但我正在为数据库而苦苦挣扎,这显然是我不擅长的。
如果有人能给我一些光,我将不胜感激。
它是:
第一个应用程序的想法很简单,该应用程序包含在学生登记册中,放置一个代码,该代码会自动将他移动到与其他人的英语水平相同的某个房间,该房间当然有一位教授,并且该级别使用特定的书有许多章节和根据章节的练习。
我的问题是我如何建立一个数据库,其中房间里有一本书有很多章节有很多练习......
不知道这是否清楚......对不起我疯了!
谢谢你的时间!!!
第一步是设计数据库,这将首先识别数据集,这些数据集将转换为包含分组值列表的表。
所以你已经确定了房间、学生?、书籍、章节、练习和教授。 这些可能是表格的候选者。
一个表由具有相同列数的行组成。 一列将保存相同类型的数据,例如房间名称。
房间表,听起来可能几乎没有房间的编号或名称信息。 为了使到目前为止提到的所有表的事情变得简单/有效,最好使用id标识符来轻松有效地识别房间,以便在将房间与其他表相关联时进行识别。
因此,您的Room表可以使用 SQL 创建,如下所示:-
CREATE TABLE IF NOT EXISTS room (_id INTEGER PRIMARY KEY, roomName TEXT UNIQUE);
学生和教授都是人,可能会共享很多相同的信息,然后两者都可以在同一张表中,也许Poeple以及其他数据,例如姓名电子邮件等,一列表明此人是否是学生或教授或其他类型的人。 您提到了级别(这可用于区分教授,例如,如果英语级别为 1-10,那么如果级别大于 10,则可能表示教授)。
所以你的Person表可能是这样的:-
CREATE TABLE IF NOT EXISTS person (_id INTEGER PRIMARY KEY, personName TEXT, personEmail TEXT, personTypeIndicator INTEGER);
书籍、章节和练习
CREATE TABLE IF NOT EXISTS book (_id INTEGER PRIMARY KEY, bookName TEXT, room_reference INTEGER NOT NULL REFERENCES room(_id) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE IF NOT EXISTS chapter (_id INTEGER PRIMARY KEY, chapterName TEXT, bookReference INTEGER NOT NULL REFERENCES book(_id) ON DELETE CASCADE ON UPDATE CASCADE);
CREATE TABLE IF NOT EXISTS excercise (_id INTEGER PRIMARY KEY, excerciseName TEXT, chapter_reference INTEGER NOT NULL REFERENCES chapter(_id) ON DELETE CASCADE ON UPDATE CASCADE);
如您所见,整个表格存在一些共性。
_id
此名称已被使用,因为它对 Android 很有用。INTEGER PRIMARY KEY
这不仅使INTEGER PRIMARY KEY
为主键(必须是唯一的并自动称为索引),而且在 SQLite 中它使列(每个表只有一个这样的列)成为rowid列的别名(最有效的index),但也允许 SQLite 为表中的每一行分配一个唯一值(每个表)。REFERENCES table(column)
这会创建一个 FOREIGN KEY 表示列中的值必须与父(引用)表(列)中的值匹配
ON DELETE CASCADE
和ON UPDATE CASCADE
,如果父行是 UPDATE 或 DELETED 则所有子行分别是 UPDATE 或 DELETED 。 这可以简单地维护(又名不是孤儿)。在编写任何代码之前,明智的做法是用一些数据测试上述结构。 您可能想要下载 SQLite 管理工具,例如 DB Browser for SQLite、Navicat、DB Beaver 等。 使用此类工具,您可以创建表、使用数据提取数据加载它们等等。
因此,使用您最喜欢的 SQLite 管理工具,您可以使用上面的 SQL 创建表,然后使用以下方法加载一些数据:-
INSERT INTO room (roomName)
VALUES ('Room1') /* _id = 1 */,('Room2') /* _id = 2 */,
('Room3') /* _id = 3 and so on */,
('Room4'),('Room5'),('Room6'),('Room7'),
('Room8'),('Room9'),('Room10'),('Roomxx')
;
INSERT INTO person (personName, personEmail, personTypeIndicator)
VALUES ('Fred','f@mail.x',0) /* _id = 1 */,
('Mary','m@mail.x',0) /* _id = 2 */,
('Jane','j@mail.x',0) /* _id = 3 and so on */,
('Bert','b@mail.x',0),('Prof Plum','pp@profmail.x',100)
;
INSERT INTO book (bookname,room_reference)
VALUES ('Book1',1),('Book2',2),('Book3',3),('Book4',4),('Book5',5),
('Book6',6),('Some other Book',7),('Book8',8),('Book9',9),('Book10',10);
;
然后您可以使用:-
SELECT * FROM room;
SELECT * FROM person;
SELECT * FROM book;
查看数据(为简洁起见未显示)。
现在有一些数据我们可以尝试根据 personTypeIndicator(0(没有房间)和 1-10(各自的房间))找出房间中的学生,为了简洁/简单,使用房间的 _id 作为指标房间#(您通常会这样做,因为对 _id 的实际值进行假设是错误的)。
以下 SQL 将执行此操作:-
SELECT * FROM book JOIN room ON room._id = book.room_reference LEFT JOIN person ON personTypeIndicator = book._id;
结果将是:-
要测试上述查询并显示更新数据的示例,可以使用以下内容:-
UPDATE person SET personTypeIndicator = _id WHERE personTypeIndicator <= 10;
如果现在运行查询,则:-
如果上述情况适合,那么您应该与查询一起竞争设计数据库。 然后,您可以继续在应用程序中实现设计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.