我如何创建此数据库?

问题描述 投票:0回答:1

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

如果有人可以给我一些光明,我将不胜感激。

有:

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

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

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

感谢您的时间!

android database sqlite database-connection flow
1个回答
0
投票

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

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

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

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

因此,您的Room表可以使用SQL沿着:-]行创建

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

学生和教授,因为他们都是人,可能会共享许多相同的信息,所以两者都可能在同一个表中,也许Poeple

与其他数据一起使用,例如sa电子邮件等,其中一列表示该人是学生还是教授,或者也许是另一种人。您提到了等级(可以用来区分一位教授,例如,如果英语的等级为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
  • 不仅使该列成为主键(必须是唯一键,并且自动称为索引),而且在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','[email protected]',0) /* _id = 1 */,
        ('Mary','[email protected]',0) /* _id = 2 */,
        ('Jane','[email protected]',0) /* _id = 3 and so on */,
        ('Bert','[email protected]',0),('Prof Plum','[email protected]',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中实施设计。

© www.soinside.com 2019 - 2024. All rights reserved.