データベース設計には現在 5 つのパラダイムがあります。通常、データベースが満たす必要があるのは最初の 3 つのパラダイムだけです
最初のパラダイム: 各列がアトミックであることを確認します
原子性とは何ですか? 細分化できないことを意味します。たとえば、以下の連絡先情報は
です。連絡先情報には、QQ、WeChat、電話が含まれますなど。明らかに、この列は原子性を満たしていません。別の QQ または電話番号の場合、第 1 正規形を満たすのは 1 つだけです。
第 2 正規形: 主キーを持つには、その他フィールドは主キーに依存する必要があります
なぜ主キーがそれほど重要なのでしょうか?テーブルをチームとみなした場合、主キーはチームのフラグであると理解できます
• 主キーがなければ、一意性はありません。一意性がなければ、このレコード行をコレクション内で見つけることができません。そのため、主キーが必要です。
他のフィールドが主キーに依存する必要があるのはなぜですか?主キーに頼らずにそれらの場所を特定する方法がないためです。さらに重要なのは、他のフィールドで構成されるレコード行は主キーと同じものを表しており、主キーは一意であり、主キーに依存するだけで一意になります。
第 3 正規形: 第 3 正規形は、推移的な依存関係を排除し、理解を容易にするものです。これは「冗長性の排除」とみなすことができます
これを理解するにはどうすればよいですか? 次の例を参照してください
#上記のようなテーブルを設計すると、見た目は普通ですが、テーブルを分割します
これを行うとより明確になります。製品番号を通じて 2 つのテーブルを直接関連付けます。あらゆる面で、すべてを 1 つのテーブルに詰め込むよりもはるかに優れています。
私たちはそれを知っています。テーブルの識別子に相当する主キーがありますが、外部キーはどうなるのでしょうか?
# 外部キー: 別のデータ テーブル内のレコードを参照します。
# 外部キー列の型は主キー列の型と一致しており、特定の主キー (主キー) と外部キー (外部キー) に依存してデータ テーブル間の関連付け/参照関係が確立されます
構文:
外部キー制約の追加
ALTER TABLE テーブル名 ADD [CONSTRAINT 制約名] FOREIGN KEY (外部キー列)
REFERENCES 関連テーブル (主キー) ;
外部チェック キーを削除します。 ALTER TABLE テーブル名 DROP FOREIGN KEY 外部キー制約名
上記の第 3 正規形の例では、冗長性を排除し、2 つのテーブルを関連付けます。通常、2 つのテーブルを接続するこの列を外部キーとして設定します。
ただし、2 つのテーブル間の関連情報をクエリする必要がある場合は、必ずしも外部キー制約を使用するとは限りません
2 つのテーブルがクエリに関連付けられている場合、外部キー制約は追加しません。これを弱参照と呼びます。
外部キー制約が追加された場合場合、それは強力な参照です。
では、これら 2 つの参照の違いは何ですか?
外部キーを使用すると、外部キーが配置されることがわかります。セカンダリ テーブルのキーはメイン テーブルの主キーを指すため、2 つのテーブル間に制約が設定されます。この時点では、メイン テーブルまたはスレーブ テーブルに関連付けられた値を自由に変更することはできません。これは強参照です
1. マスターテーブルに該当するレコードがない場合、スレーブテーブルにレコードを追加できません
#2. マスターテーブルの値は変更できません、スレーブ テーブルに孤立したレコードが発生します3、スレーブ テーブルにはマスター テーブルに対応するレコードがあり、その行をマスター テーブルから削除することはできません4。マスターを削除する前にテーブル、最初にスレーブ テーブルを削除します弱い参照を使用すると、関連付けを自由に変更できます。-- 创建学生表 CREATE TABLE student( id INT PRIMARY KEY AUTO_INCREMENT, num INT, NAME VARCHAR(20), sex CHAR(1), gradeId INT -- 从表外键列 ) -- 创建年级表 CREATE TABLE grade( -- 主表主键列 id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ) -- 添加外键约束 ALTER TABLE student ADD CONSTRAINT fk_grade FOREIGN KEY(gradeId) REFERENCES grade(id)
#ご覧のとおり、外部キー制約が GradeId フィールドに追加されています
この時点で、メイン テーブルの列を削除しようとします:
はい、メイン テーブルを自由に変更することはできません。一度変更すると、データはスレーブ テーブル内のデータは分離されます。
#内部結合
##●● 条件を満たす 2 つのテーブルの交差データをクエリします。
構文:表 1、表 2 から結果を選択します (表 1.列 1 = 表 2.列 2)
デカルト積現象: テーブル 1 には m 行があり、テーブル 2 には n 行があり、結果 =m*n 自己接続とは何ですか?これは、自分自身を自分自身と関連付け、自分自身とデカルト積を計算することを意味します。これは簡単に理解できないかもしれません。例を次に示します:内部結合には、等価結合、非等価結合、自己結合が含まれますここでは主に自己結合について説明します。
我们平时在淘宝网购填地址的时候, 都是采用选择的方式, 先选择省,然后是省下面的市, 接着是市下面的区(县) ,它们都是在数据库中存着, 如何去实现这个功能呢 ?
有人可能会说, 建三张表相互关联即可 , 但实际是 , 我们采用自连接的方式 , 一张表即可实现
CREATE TABLE demo( -- 建立demo表 id INT PRIMARY KEY, NAME VARCHAR(50), pid INT )
往表中填入数据, pid为关联上一级的id
-- 自连接 -- 在多表关系中我们需要定义别名来区分 SELECT d1.name,d2.name,d3.name FROM demo d1 INNER JOIN demo d2 ON d1.id=d2.pid --自连接条件 INNER JOIN demo d3 ON d2.id=d3.pid --自连接条件 WHERE d3.id=6101011 -- 查询条件
结果 :
外连接又分为左外连接与右外连接
先看左外连接 :
语法
select 结果 from 表1 left join 表 2 on 表1.column1 = 表 2.column2
左连接和内连接有什么不同呢? 通过两幅图我们就可以看出 ,内连接是取了两张表的共同部分 , 而左连接是取了左边表的全部(包括两张表的共同部分)
也就是说, 不仅查询两张表的共同部分, 并且左边表会被全部查询出来
我们通过上面外键所建的表来演示 , 为了演示方便,我们为student表再添加一列数据
可以看到, 此时第五列并没有去关联grade表
-- 左外连接查询 SELECT * FROM student s LEFT JOIN grade g ON s.gradeId= g.id
查询结果如下 :
那么说到这, 右外连接也就不难理解了 , 每次都会完整的查询右边的表
同样我们再为grade添加一条无关联的数据
语法 :
select 结果 from 表1 right join 表2 on 表1.column1 = 表2.column2
-- 右外连接查询 SELECT * FROM student s RIGHT JOIN grade g ON s.gradeId= g.id
查询结果 :
可以看到, 右表被完全查询
以上がMySQL マルチテーブル関連付けクエリの例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。