数据库关系

2022/02/07 11:40

之前写过一些小工具,也用过数据库不过就使用一些增删改查的操作,因为逻辑关系比较简单就直接使用一个表一把梭了。这写这个博客网站的时候,一篇文章有几个标签,一个标签有对应几篇不同的文章,这种多对多关系用一个表实现就不太方便了。在使用多对多关系的时候有几个表,需要有一个东西把它们连接起来,这个就是外键,所以下面我们先介绍主键与外键,然后在实现一对多(One-to-many relationships)关系与多对多关系(many to may relationships),数据库采用的是运用广泛的MySQL数据库实现的。

1. 主键与外键

主键(Primary Key)是用来区分一个表中不同行,也就是说他应该是是独特的(UNIQUE)并且不能为NULL。

外键(Foreign Key)是来用连接多个表的,他可以指向另外一个表的主键。

2. 关系

因为一对一关系确实没啥好说的,这里就介绍一对多关系与多对多关系。

2.1 一对多关系

现在有一个需求,一篇文章属于且仅属于一个分类,一个分类可以有多篇文章,数据库应该要怎么设计。

首先假设有两个表,分别为Articles与Categories,省略其他无关的字段,只保留关键字段如下所示。

Articles Table

ArticleID ArticleTitle ArticleCategory
1 Python变量的赋值与复制 1
2 傅里叶分析 2
3 数据库关系 1

Categories Table

CategoryID CategoryName
1 软件编程
2 理论学习

首先创建Categories Table

CREATE TABLE Categories(
    CategoryID MEDIUMINT NOT NULL AUTO_INCREMENT,
    CategoryName VARCHAR(10),
    PRIMARY KEY (CategoryID)
);

然后创建Articles Table

CREATE TABLE Articles(
    ArticleID MEDIUMINT NOT NULL AUTO_INCREMENT,
    ArticleTitle VARCHAR(20),
    ArticleCategory MEDIUMINT,
    PRIMARY KEY (ArticleID),
    FOREIGN KEY (ArticleCategory) REFERENCES Categories(CategoryID)
);

2.2 多对多关系

现在有一个需求一篇文章有多个标签,一个标签同时也可以对应多篇文章

首先假设有三个表,分别为Articles,ArticleTags,与Tags,省略其他无关的字段,只保留关键字段如下所示。

Articles Table

ArticleID ArticleTitle
1 Python变量的赋值与复制
2 傅里叶分析
3 数据库关系

Tags Table

TagsID TagName
1 Python
2 数学
3 编程
4 数据库

ArticleTags Table

ArticleTagsID ArticleID TagID
1 1 1
2 2 2
3 3 4
4 1 3

首先创建Articles Table

CREATE TABLE Articles(
    ArticleID MEDIUMINT NOT NULL AUTO_INCREMENT,
    ArticleTitle VARCHAR(20),
    PRIMARY KEY (ArticleID)
);

然后创建Tags Table

CREATE TABLE Tags(
    TagsID MEDIUMINT NOT NULL AUTO_INCREMENT,
    TagName VARCHAR(20),
    PRIMARY KEY (TagsID)
);

最后创建ArticleTags Table

CREATE TABLE ArticleTags(
    ArticleTagsID MEDIUMINT NOT NULL AUTO_INCREMENT,
    ArticleID MEDIUMINT,
    TagID MEDIUMINT,
    PRIMARY KEY (ArticleTagsID),
    FOREIGN KEY (ArticleID) REFERENCES Articles(ArticleID),
    FOREIGN KEY (TagID) REFERENCES Tags(TagsID)
);