1.テーブル設計の関係:
1. 1対1:データの一部は頻繁にアクセスされ、一部のデータはあまりアクセスされないため、2つのテーブルを作成できます。
- 1対1とは:テーブルABが2つあり、テーブルAの1つのデータがテーブルBの1つのデータに対応し、テーブルBの1つのデータもテーブルAの1つのデータに対応しています。
- アプリケーションシナリオ:ユーザーテーブルとユーザー情報拡張テーブル、製品テーブルと製品情報拡張テーブル、
外部キー:テーブルでリレーションシップを確立するために使用されるフィールドは、外部キーと呼ばれます。テーブルには複数の外部キーがありますが、主キーは1つだけです。
- 関係が確立されている場合:外部キーをテーブルからメインテーブルの主キーに追加します。
例:ユーザーテーブルとuserinfoテーブルを作成します。ユーザーにユーザー名、パスワード、ニックネーム、年齢、住所、および性別のフィールドが含まれている場合。主キーIDを追加せずに、よく使用されるユーザー名とパスワードをユーザーテーブルに格納し、同時に副テーブルuserinfoを作成し、他のニックネーム、年齢などの情報を格納し、主テーブルの主キーIDに対応する外部キーユーザーIDを追加して、 1対1の関係を実現するために、ユーザーのuserinfoにクエリを実行する必要がある場合、対応するIDを使用して、テーブルの外部キーのユーザーIDからのクエリに一致させることができます。
2. 1対多: 2つのテーブルABがあり、テーブルAの1つのデータはテーブルBの複数のデータに対応し、テーブルBの1つのデータはテーブルAの1つのデータに対応します。
- アプリケーションシナリオ:ユーザーテーブルと部門テーブル、製品テーブルと分類テーブル(カテゴリには多くの製品が含まれますが、製品は1つのカテゴリにしか所属できません)。
- 関係を確立します。複数のセグメントに外部キーを追加し、別のテーブルの主キーをポイントします。
例:empテーブルとdeptテーブルの作成:たとえば、dept部門テーブルを作成し、主キーIDを追加しました。2つの部門があり、1つは技術部門ID = 1、もう1つは設計部門がid = 2に対応しています。この時点で、別のempテーブルを作成します。そして、メインテーブルdeptの主キーIDに対応する外部キーdeptid = 1を追加します。たとえば、Xiao Zhang deptid = 1、Xiao Li deptid = 1、Xiao Wang deptid = 2、Xiao Zhao deptid = 2これをdeptテーブルに渡します主キーIDは1で、テーブルemp内の対応するdeptidから一致する1を見つけます。XiaoZhangとXiao Liの2人が見つかり、1対多を実現します。メインテーブルdeptはスレーブテーブルempに対応します複数のデータ。
3.多対多: 2つのテーブルABがあり、テーブルAの1つのデータはテーブルBの複数のデータに対応し、テーブルBの1つのデータはテーブルAの複数のデータに対応します。
- アプリケーションシナリオ:教師テーブルと生徒テーブル、ユーザーテーブルと役割テーブル、役割テーブルと権限テーブル、
- リレーションシップを確立します。3番目のリレーションシップテーブルを介して2つのメインテーブル間のリレーションシップを保存します。3番目のリレーションシップテーブルは2つのメインテーブルの主キーを記録します。
例:教師テーブル、生徒テーブル、および関係テーブルを作成します。
create table teacher(id int primary key auto_increment,name varchar(10));
create table student(id int primary key auto_increment,name varchar(10));
create table t_s(tid int,sid int);
各生徒の名前と対応する教師の名前をクエリします。
select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id;
李先生の生徒は誰ですか:
select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id where t.name = '李老师';
Xiaoliの先生を確認してください:
select s.name,t.name from t_s ts join teacher t on ts.tid = t.id join student s on ts.sid = s.id where s.name = '小丽';
4.自己関連付け:外部キーを現在のテーブルに追加し、外部キーの値が現在のテーブルの主キーを指すこの関連付け方法は自己関連付けと呼ばれます。
- アプリケーションシナリオ:ユーザーテーブルで、一部のユーザーには上位のリーダーがいる場合とない場合があります。現時点では、上位のリーダーの主キーIDに外部キーを追加できます。
例:個人テーブルを作成し、主キーID、名前、マネージャーリーダーが主キーIDを指す
create table person(id int primary key auto_increment,name varchar(10),mgr int);
次のデータを保存します。効果は次のとおりです。
insert into person values(null,'如来',null),(null,'唐僧',1),(null,'悟空',2),(null,'猴孙',3);
各人の名前と上司の名前をクエリします。
select p.name,p2.name as 上级 from person p left join person p2 on p.mgr = p2.id;
5.テーブル設計ケース:権限管理
- 実装方法:権限管理機能を実現するためには、メインテーブル3つとリレーショナルテーブル2つを用意する必要があります。
- アプリケーションシナリオ:
- メインテーブル:ユーザーテーブル、ロールテーブル、ロール許可テーブル
- 関係テーブル:ユーザーとロール間の対応、およびロールとロール権限間の対応
演習:テーブルを作成します。
create table user(id int primary key auto_increment,name varchar(10));
create table role(id int primary key auto_increment,name varchar(10));
create table module(id int primary key auto_increment,name varchar(10));
create table u_r(uid int,rid int);
create table r_m(rid int,mid int);
データを挿入:
insert into user values(1,'刘德华'),(2,'凤姐');
insert into role values(1,'男游客'),(2,'男会员'),(3,'女游客'),(4,'女管理员');
insert into module values(1,'男浏览'),(2,'男发帖'),(3,'女浏览'),(4,'女发帖'),(5,'女删帖');
ユーザーと役割の関係を保存します。AndyLau:男性のメンバーと女性の観光客Sister Feng:女性の管理者と男性の観光客:
insert into u_r values(1,2),(1,3),(2,1),(2,4);
役割と権限を保存します。
insert into r_m values(1,1),(2,1),(2,2),(3,3),(4,3),(4,4),(4,5);
各ユーザーの権限は何ですか?
select u.name 名字,m.name 权限 from user u join u_r on u.id = ur.id join r_m rm on ur.rid = rm.rid join module m on rm.mid = m.id;
Sister Fengの権限を照会します。
select u.name 名字,m.name 权限 from user u join u_r ur on u.id=ur.uid join r_m rm on rm.rid=ur.rid join module m on rm.mid=m.id where u.name='凤姐';
男性のプレビュー権限を持つクエリ:
select m.name 权限,u.name 预览 from user u join u_r ur on u.id=ur.uid join r_m rm on ur.rid=rm.rid join module m on m.id=rm.mid where m.name in('男浏览','女浏览');