記事ディレクトリ
マルチテーブルデザイン関連クエリ
なぜマルチテーブルデザインが必要なのですか?
マルチテーブル設計の目的は、冗長なデータを排除したり、テーブルを複数のテーブルに分割したり、複数のテーブルから共通のデータを1つのテーブルに抽出したりすることです。
たとえば、次の2つのテーブルがあります
ナンバリング | 名前 | 国家 | 国籍 |
---|---|---|---|
1 | 張さん | 漢国籍 | 中国 |
2 | Li Si | 漢国籍 | 中国 |
ナンバリング | 州 | 国籍 |
---|---|---|
1 | Shaanxi | 中国 |
2 | 広州 | 中国 |
これらの2つのテーブルには、民族性や国籍など、多くの冗長性があります。複数のテーブルで設計すると、次のようになります。
ナショナルテーブル
民族番号 | 国家 |
---|---|
1 | 漢国籍 |
2 | ホイ |
カントリーテーブル
国コード | 国籍 |
---|---|
1 | 中国 |
2 | パキスタン |
そして、上位2つのテーブルは
ナンバリング | 名前 | 民族番号 | 国コード |
---|---|---|---|
1 | 張さん | 1 | 1 |
2 | Li Si | 1 | 1 |
ナンバリング | 州 | 国コード |
---|---|---|
1 | Xi'an | 1 |
1 | 広州 | 1 |
このようにして、重複する冗長データを排除し、1つのデータを再利用できます。
データベース設計パラダイム
1.冗長性が少なく、合理的な構造のデータベースを構築するには、データベースを設計する際に特定のルールに従う必要があります。このルールは、リレーショナルデータベースでは時間パラダイムとも呼ばれます。このパラダイムは、特定の設計要件を満たす要約です。
2.現在のリレーショナルデータベースには6つのパラダイムがあります。
(1)最初の通常の形式(1NF);
(2)第2正規形(2NF);
(3)第3正規形(3NF);
(4)バスコードパラダイム(BCNF);
(5)第4正規形(4NF);
(6)5番目の通常の形式(5NF)、完全な通常の形式としても知られています。
3.最小要件を満たすパラダイムは、最初のパラダイム(1NF)です。最初のパラダイムに基づいて、より規範的な要件をさらに満たすことが2番目のパラダイム(2NF)と呼ばれ、残りのパラダイムは順番になります。一般的に言えば、データベース3番目の通常の形式(3NF)のみが必要です。
最初の通常の形式(1NF)
最初の通常の形式は最も基本的な通常の形式です。データベーステーブルの各列がアトミックのままであることを確認する必要があります。データベーステーブルのすべてのフィールド値が分解できないアトミック値である場合、データベーステーブルが最初の通常の形式を満たしていることを意味します。
例えば
ナンバリング | 名前 | 連絡先の詳細 |
---|---|---|
1 | ワンマジ | メール/電話/ qq |
最初の正規形を満たした後のテーブル構造
ナンバリング | 名前 | メールボックス | 電話 | |
---|---|---|---|---|
1 | ワンマジ | [email protected] | 1313131 | 2212321 |
セカンドノーマルフォーム(2NF)
1. 2番目のパラダイムは、主キーを持つことであり、他のフィールドが主キーに依存することを要求します。
2.主キーがないと一意性がなく、一意性がないとこのレコードの行をコレクションに配置できないため、主キーが必要です。
3.他のフィールドが主キーに依存しているのはなぜですか?主キーに依存していないため、見つかりません。さらに重要なことに、他のフィールドと主キーで構成されるレコードの行は同じことを表し、主キーは一意です。主キーに依存するだけで、一意になります。
サードノーマルフォーム(3NF)
3つ目のパラダイムは、一時的な依存関係を排除し、理解を容易にすることであり、「冗長性の排除」と見なすことができます。
注文番号 | 量 | 製品番号 | 商品名 | 単価 | 注文金額 |
---|---|---|---|---|---|
1000 | 2 | 2020 | 携帯電話 | 2000 | 4000 |
製品番号 | 商品名 | 単価 |
---|---|---|
2020 | 携帯電話 | 2000 |
注文番号 | 量 | 注文金額 | 製品番号 |
---|---|---|---|
1000 | 2 | 4000 | 2020 |
一般的に言って、データベースは第3正規形(3NF)のみを必要とします。
データベースインスタンス
学生表:氏名、性別、携帯電話番号、学年番号、登録時期
学年表:学年番号、学年名、学年紹介
コーススケジュール:コース番号、コース名、コース紹介
表と表の関係:
1.One 1対1の関連付け;
2。1対多の関連付け;
3。多対1の関連付け;
4。多対多の関連付け。
-- 创建年级表
CREATE TABLE t_grade(
g_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'年级编号',
g_name VARCHAR(10) COMMENT'年级名称',
g_desc VARCHAR(50) COMMENT'年级介绍'
)
-- 创建学生表
CREATE TABLE t_stu(
s_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学号',
s_name VARCHAR(10) COMMENT'姓名',
s_sex CHAR(1) DEFAULT'男' COMMENT'性别',
s_phone INT(11) COMMENT'电话',
s_g_id INT COMMENT'年级编号',
reg_time DATETIME COMMENT'注册时间'
)
弱い関連関係の導入:テーブル構造は本質的に無関係です。テーブルとテーブルの関係は人為的に定義されています。関連テーブルのデータを削除しても、他のデータには影響しません。上の図のグレード番号とグレードテーブルは一種の弱い関連です。関係。
外部キー
強い関連付け関係について説明し、外部キーに制約を追加し、外部キーに対応するプライマリキー(別のテーブルのプライマリキーに対応する外部キー)との関連付け関係を強制します。
1.外部キー:別のデータテーブルのレコードを参照します。
2.外部キー列のデータタイプは、プライマリキー列と一致している必要があります。
3.データテーブル間の関連付け/参照関係は、特定のプライマリキーと外部キーによって確立されます。
テーブルを作成するときに外部キーを追加するための構文:
create table 表名(
constraint 约束名 foreign key(外键列) references 主键表(主键列)
)
外部キー制約構文を追加します。
alter table 表名
add [constraint 约束名(自己起的)]
foreign key(外键列)
references 关联表(主键)
外部キー構文を削除します。
alter table 表名 drop foreign key 外键约束名;
データベースインスタンス
上記の表に外部キーを追加します
ALTER TABLE t_stu
ADD CONSTRAINT s_foreign_key
FOREIGN KEY(s_g_id)
REFERENCES t_grade(g_id);
-- 创建课程表,多对多关系,一个学生对应多个课程,一个课程对应多个学生
CREATE TABLE t_course(
c_id INT PRIMARY KEY AUTO_INCREMENT COMMENT'课程号',
c_name VARCHAR(10) COMMENT'课程名',
c_desc VARCHAR(20) COMMENT'课程介绍'
)
-- 设计关系表来存储多个数据之间的关系
CREATE TABLE t_stu_course(
sc_id INT PRIMARY KEY AUTO_INCREMENT,
sc_stu_id INT,
sc_course_id INT,
CONSTRAINT stu_id_fk FOREIGN KEY(sc_stu_id) REFERENCES t_stu(s_id),
CONSTRAINT cou_id_fk FOREIGN KEY(sc_course_id) REFERENCES t_course(c_id)
)
注意
1.マスターテーブルに対応するレコードがない場合、そのレコードをスレーブテーブルに追加することはできません。
2.メインテーブルの値を変更して、スレーブテーブルのレコードを分離することはできません
3.テーブルのメインテーブルに対応するレコードがあり、メインテーブルから行を削除することはできません。
4.プライマリテーブルを削除する前に、セカンダリテーブルを削除します
関連クエリ
概要概要
1.関連付けられたクエリはマルチテーブルクエリとも呼ばれます。クエリフィールドが複数のテーブルからのものである場合、結合クエリが使用されます
2.カルテシアン積現象:表1にはm行、表2にはn行、クエリ結果にはm * n行があります。
(1)理由:有効な接続条件がありません
(2)回避方法:有効な接続条件を追加します
分類
インナージョイン
条件を満たす2つのテーブルの交差点データをクエリします
文法:
select 结果 from 表1,表2 where 表1.列1=表2.列2
SELECT s_id,s_name,s_sex,s_g_id,g_name,g_id
FROM t_stu,t_grade
WHERE s_g_id = g_id
1.同等の接続
#等值连接
/*
语法
select 结果 from 表名 inner join 被连接的表名(外键表) on 外键=主键
*/
SELECT *
FROM t_stu
INNER JOIN t_grade ON s_g_id = g_id
2.非等価接続
#创建一个等级表
CREATE TABLE t_level(
l_name CHAR(1),
l_min_score INT,
l_max_score INT
)
/*
非等值连接
语法
select 结果
from 表1
inner join 表2
on 表1.列1 between 表2.列2 and 表2.列3
*/
SELECT
s_name,
l_name
FROM
t_stu
INNER JOIN t_level
ON s_score BETWEEN l_min_score
AND l_max_score
3.自己接続:テーブルで接続関係を確立します
CREATE TABLE t_area(
a_id INT,
a_name VARCHAR(10),
a_father INT
)
#在一张表中建立连接关系
SELECT
t1.a_name,
t2.a_name
FROM
t_area t1
INNER JOIN t_area t2
ON t1.a_father = t2.a_id;
アウタージョイン
1.左外側結合(左結合)
/*
语法
select 结果
from 表1
left join 表2
on 表1.字段=表2.字段l;
不管表1的字段与表2的字段是否有连接,都会显示表1的所有信息
*/
SELECT *
FROM t_stu s
LEFT JOIN t_grade g
ON s.s_g_id = g.g_id;
2.右外側結合(右結合)
/*
语法
select 结果
from 表1
right join 表2
on 表1.字段1=表2.字段2;
不管表1有没有和表2中的所有数据关联,都会显示出表2的所有
*/
SELECT *
FROM t_stu s
RIGHT JOIN t_grade g
ON s.s_g_id = g.g_id;
クロスコネクト
-- 交叉连接 类似于内连接
SELECT *
FROM t_stu s
CROSS JOIN t_grade g
ON s.s_g_id = g.g_id;