繁体   English   中英

我如何创建这个数据库?

[英]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);
  • 请注意,假设对于学生来说 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这不仅使INTEGER PRIMARY KEY为主键(必须是唯一的并自动称为索引),而且在 SQLite 中它使列(每个表只有一个这样的列)成为rowid列的别名(最有效的index),但也允许 SQLite 为表中的每一行分配一个唯一值(每个表)。
  • REFERENCES table(column)这会创建一个 FOREIGN KEY 表示列中的值必须与父(引用)表(列)中的值匹配
    • 由于 SQLite 中的一个错误 NULL(无)被认为与另一个 NULL 不同,因此 NOT NULL 用于确保您不能引用 NULL。
    • ON DELETE CASCADEON 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);
;
  • 插入 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;

结果将是:-

在此处输入图片说明

  • 正如预期的那样,因为所有学生都添加了 personTypeIndicator 为 0 并且没有 _id 为 0 的房间。

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

UPDATE person SET personTypeIndicator = _id WHERE personTypeIndicator <= 10;
  • 请注意,这模拟了正在升级的学生,使用他们的 _id (1-4) 来更新 personTypeIndicator,但前提是 personTypeIndicator 为 10 或更少(因此 Plum 教授不会更改)。

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

在此处输入图片说明

如果上述情况适合,那么您应该与查询一起竞争设计数据库。 然后,您可以继续在应用程序中实现设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM