如何创建该数据库?

我正在尝试开发英语应用程序,但是我在数据库上苦苦挣扎,显然我并不擅长于此。

如果有人能给我一些启发,我将不胜感激。

有:

第一个应用程序的想法很简单,该应用程序包含在学生注册表中,并放置一个代码,该代码会自动将他移动到与其他人达到英语水平的某个房间,该房间当然有一位教授,并且该级别使用特定的这本书有很多章节,并根据章节进行练习。

我的问题是我如何建立一个数据库,房间里有一本书,其中有很多章,其中有很多练习。...

不知道是否清楚...对不起,我疯了!

感谢您的宝贵时间!

bbbaac 回答:如何创建该数据库?

第一步是设计数据库,首先确定数据集,这些数据集会将包含一组分组值列表的表转换为表。

因此,您已经确定了房间,学生?,书籍,章节以及练习和教授。这些可能是表的候选对象。

表由行组成,每行具有相同的列数。列将保存相同类型的数据,例如房间名称。

房间表,听起来好像它几乎没有房间的编号或名称信息。为了使到目前为止的所有表都更容易/有效,将它与其他表关联时,最好使用 id 标识符轻松有效地识别房间。

因此您的 Room 房间表可以使用SQL沿着:-

CREATE TABLE IF NOT EXISTS room (_id INTEGER PRIMARY KEY,roomName TEXT UNIQUE);

学生和教授都是人,可能会共享许多相同的信息,因此他们俩都可能在同一个表中,也许以及其他数据,例如姓名电子邮件等,一列表示该人是学生还是教授,或者也许是另一种人。您提到了等级(可以用来区分一位教授,例如,如果英语的等级为1-10,那么该等级大于10则表明是一位教授)。

因此您的表可能类似于:-

CREATE TABLE IF NOT EXISTS person (_id INTEGER PRIMARY KEY,personName TEXT,personEmail TEXT,personTypeIndicator INTEGER);
  • 请注意,假设是personTypeIndicator对学生而言为1-10,对教授而言为100。

书籍,章节和练习

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 这不仅使列成为主键(必须是唯一键,并且自动称为索引),而且在SQLite中它使列成为列(每个列仅一个这样的列)表)是 rowid 列(最有效的索引)的别名,但还允许SQLite为表中的每一行分配唯一值(每个表)。
  • REFERENCES table(column) ,这将创建一个FOREIGN KEY,表示列中的值必须与父(引用)表(列)中的值匹配
    • 由于SQLite中存在错误,因此NULL(无)与另一个NULL不同,因此使用NOT NULL来确保您不能引用NULL。
    • ON DELETE CASCADE ON UPDATE CASCADE ,如果父级为UPDATE或DELETED,则所有子行分别为UPDATE或DELETED。这可以简单地维护(也就是不是孤儿)。

在编写任何代码之前,明智的做法是使用一些数据测试上述结构。您可能需要下载SQlite管理工具,例如用于SQLite的数据库浏览器,Navicat,数据库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);
;
  • 插入11个房间行,添加4个人,并添加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;

结果将是:-

enter image description here

  • 我们很期待,因为所有学生的personTypeIndicator都被添加为0,并且没有房间的_id为0。

要测试上述查询并显示更新数据的示例,可以使用以下内容:-

UPDATE person SET personTypeIndicator = _id WHERE personTypeIndicator <= 10;
  • 请注意,这模仿通过使用_id(1-4)来更新personTypeIndicator的学生,但前提是personTypeIndicator为10以下(因此Plum教授不变)。

如果查询现在正在运行,则:-

enter image description here

如果以上情况适合,那么您应该与查询一起设计数据库。然后,您可以继续在App中实施设计。

本文链接:https://www.f2er.com/2973336.html

大家都在问