之前写过一些小工具,也用过数据库不过就使用一些增删改查的操作,因为逻辑关系比较简单就直接使用一个表一把梭了。这写这个博客网站的时候,一篇文章有几个标签,一个标签有对应几篇不同的文章,这种多对多关系用一个表实现就不太方便了。在使用多对多关系的时候有几个表,需要有一个东西把它们连接起来,这个就是外键,所以下面我们先介绍主键与外键,然后在实现一对多(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(
NOT NULL AUTO_INCREMENT,
CategoryID MEDIUMINT VARCHAR(10),
CategoryName PRIMARY KEY (CategoryID)
);
然后创建Articles Table
CREATE TABLE Articles(
NOT NULL AUTO_INCREMENT,
ArticleID MEDIUMINT VARCHAR(20),
ArticleTitle
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(
NOT NULL AUTO_INCREMENT,
ArticleID MEDIUMINT VARCHAR(20),
ArticleTitle PRIMARY KEY (ArticleID)
);
然后创建Tags Table
CREATE TABLE Tags(
NOT NULL AUTO_INCREMENT,
TagsID MEDIUMINT VARCHAR(20),
TagName PRIMARY KEY (TagsID)
);
最后创建ArticleTags Table
CREATE TABLE ArticleTags(
NOT NULL AUTO_INCREMENT,
ArticleTagsID MEDIUMINT
ArticleID MEDIUMINT,
TagID MEDIUMINT,PRIMARY KEY (ArticleTagsID),
FOREIGN KEY (ArticleID) REFERENCES Articles(ArticleID),
FOREIGN KEY (TagID) REFERENCES Tags(TagsID)
);