首页 > 解决方案 > 连接科目和考试委员会的简单数据库结构

问题描述

我是 Sql 新手,想使用 sqlite 创建一个数据库来存储有关哪些考试委员会需要哪些主题的数据。

到目前为止,我已经创建了两张表——一张board叫做topic. 我不确定我应该如何表示板和主题之间的关系。我已经阅读了一些关于范式的内容,并且我很确定我不应该将多个条目放入一个字段中,而且拥有诸如topic1等之类的字段topic2也不是要走的路。

到目前为止,我的 sql 如下。有人可以帮我下一步吗 - 如何让这个数据库真正满足我的要求,同时又不违反书中的每一条规则?

例如,我希望能够快速找出哪些板需要集合论或互易函数等知识。

提前致谢。

BEGIN TRANSACTION;
CREATE TABLE IF NOT EXISTS "topic" (
    "id"    INTEGER PRIMARY KEY AUTOINCREMENT,
    "topic_name"    TEXT NOT NULL,
    "level" INTEGER
);
CREATE TABLE IF NOT EXISTS "board" (
    "id"    INTEGER PRIMARY KEY AUTOINCREMENT,
    "board_name"    TEXT NOT NULL UNIQUE,
    "link_to_syllabus"  TEXT
);
INSERT INTO "topic" ("id","topic_name","level") VALUES (1,'Pythagoras'' Theorem','F');
INSERT INTO "topic" ("id","topic_name","level") VALUES (2,'Circle theorems','H');
INSERT INTO "topic" ("id","topic_name","level") VALUES (3,'',NULL);
INSERT INTO "board" ("id","board_name","link_to_syllabus") VALUES (0,'Edexcel','https://qualifications.pearson.com/en/qualifications/edexcel-gcses/mathematics-2015.html');
INSERT INTO "board" ("id","board_name","link_to_syllabus") VALUES (1,'OCR','https://www.ocr.org.uk/qualifications/gcse/mathematics-j560-from-2015/');
COMMIT;

标签: sqlitedatabase-design

解决方案


如果我理解,一个板可以有一个或多个主题,一个主题可以在一个或多个板上。如果它是正确的,您正在搜索多对多关系,这是通过表获得的:

CREATE TABLE board_topic (
    board_id   INTEGER  NOT NULL
                          REFERENCES topic (id),
    topic_id INTEGER  NOT NULL
                          REFERENCES board (id),
    CONSTRAINT pk PRIMARY KEY (
        board_id   ,
        topic_id 
    )
)

关于您要求的查询,在您将一些数据插入刚刚显示的关联表后,查询如下所示:

SELECT board.id, board_name FROM board 
JOIN board_topic ON board.id = board_topic.board_id 
JOIN topic ON topic.id = board_topic.topic_id 
WHERE topic_name = "Circle theorems";

推荐阅读