データベースの基本概念
- データベース
- RDBMS
- SQL
- MySQL
学習目標
- データのCRUD(作成、読み取り、更新、削除)関連のSQLステートメントを熟練して記述できる
データストレージ
-
以前の記録方法:結び目による記録
-
このような記録も存在:甲骨文字
-
その後、このように記録開始:図書
従来のデータ記録の欠点:
- 保存が難しい
- バックアップが困難
- 検索が不便
現代の手法----ファイル
- 使用が簡単、例えばPythonのopenでファイルを開き、read/writeで読み書き、closeでファイルを閉じる
- データ容量が大きい場合、十分に対応できず、パフォーマンスも劣る
- 拡張が難しい
現代の手法----データベース
- 永続的なストレージ
- 読み書き速度が非常に高い
- データの有効性を保証
- プログラムサポートが非常に良好で、拡張が容易
実際の倉庫はこのようです:
私たちが見るのはこのようです
顧客が見るのはこのようです:
データベース
データベースは特別なファイルの一種で、必要なデータを保存しています
リレーショナルデータベースの核心要素
- データ行(レコード)
- データ列(フィールド)
- データテーブル(データ行の集合)
- データベース(データテーブルの集合)
RDBMS
Relational Database Management System
テーブルによってリレーショナルを表現
-
現在主に使用されている2種類のデータベース:リレーショナルデータベース、非リレーショナルデータベース。本部分では主にリレーショナルデータベースを議論し、非リレーショナルデータベースは後で学習します
-
いわゆるリレーショナルデータベースRDBMSは、リレーショナルモデルに基づいて構築されたデータベースで、集合代数などの数学的概念や方法を用いてデータベース内のデータを処理します
-
データベースランキングの確認:https://db-engines.com/en/ranking
-
リレーショナルデータベースの主な製品:
-
oracle:以前の大規模プロジェクトで使用、銀行、通信などのプロジェクト
-
mysql:Web時代で最も広く使用されているリレーショナルデータベース
-
ms sql server:マイクロソフトのプロジェクトで使用
-
sqlite:軽量データベース、主にモバイルプラットフォームで使用
RDBMSとデータベースの関係
SQL
Structured Query Language
SQLは構造化照会言語で、RDBMSのデータベースを操作するための言語です。現在のリレーショナルデータベースはすべてSQL言語をサポートしており、つまりoracle、sql server、mysql、sqliteなどすべてのリレーショナルデータベースをSQLで操作できます
- SQLステートメントは主に次のように分類されます:Webプログラマーにとって重要なのはデータのCRUD(作成、読み取り、更新、削除)で、DQL、DMLを熟練して記述でき、DDLを使用してデータベース、テーブルの操作を記述でき、TPL、DCL、CCLなどの他の言語は理解できれば十分です
- DQL:データ照会言語、データの照会に使用、例:select
- DML:データ操作言語、データの追加、変更、削除に使用、例:insert、update、delete
- TPL:トランザクション処理言語、トランザクションの処理に使用、begin transaction、commit、rollbackを含む
- DCL:データ制御言語、権限の付与と回収を行う、例:grant、revoke
- DDL:データ定義言語、データベース、テーブルの管理などを行う、例:create、drop
- CCL:ポインタ制御言語、ポインタを制御してテーブル操作を実行する、例:declare cursor
- SQLは特別な言語で、リレーショナルデータベースを操作するために特別に設計されています
- 大文字小文字を区別しません
学習要件
- データのCRUD関連のSQLステートメントの記述を熟練する
- Pythonコードでデータを操作するのはSQLステートメントを通じてデータを操作することです
# Connection接続の作成
conn = connect(host='localhost', port=3306, user='root', password='mysql', database='python1', charset='utf8')
# Cursorオブジェクトの取得
cs = conn.cursor()
# 更新
# sql = 'update students set name="劉邦" where id=6'
# 削除
# sql = 'delete from students where id=6'
# selectステートメントを実行し、影響を受ける行数を返す:1件の学生データを照会
sql = 'select id,name from students where id = 7'
# sql = 'SELECT id,name FROM students WHERE id = 7'
count=cs.execute(sql)
# 影響を受ける行数を表示
print(count)
MySQLの概要
- MySQL公式サイトをクリックして確認
- MySQLはリレーショナルデータベース管理システムで、スウェーデンのMySQL AB社が開発し、その後Sun社に買収され、Sun社はOracle社に買収され、現在Oracleの製品となっています
特徴
- CとC++で記述され、複数のコンパイラでテストされ、ソースコードの移植性を保証
- Linux、Windows、AIX、FreeBSD、HP-UX、MacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solarisなど多种のオペレーティングシステムをサポート
- C、C++、Python、Java、Perl、PHP、Eiffel、Rubyなど多种のプログラミング言語にAPIを提供
- マルチスレッドをサポートし、CPUリソースを十分に活用
- 最適化されたSQL照会アルゴリズム、照会速度を効果的に向上
- 多言語サポート、一般的なエンコーディング如GB2312、BIG5、UTF8をサポート
- TCP/IP、ODBC、JDBCなど多种のデータベース接続経路を提供
- データベース操作の管理、チェック、最適化に使用される管理ツールを提供
- 大規模なデータベース。数千万レコードを処理できる大規模なデータベース
- 複数のストレージエンジンをサポート
- MySQLソフトウェアは二重ライセンスポリシーを採用し、コミュニティ版と商用版に分かれています。そのサイズが小さく、速度が速く、総所有コストが低い、特にオープンソースであるという特徴から、中小規模のウェブサイトの開発では通常MySQLをウェブサイトデータベースとして選択します
- MySQLは標準的なSQLデータ言語形式を使用
- MySQLはカスタマイズ可能で、GPLプロトコルを採用しており、ソースコードを変更して独自のMySQLシステムを開発できます
- オンラインDDL変更機能
- レプリケーショングローバルトランザクション識別子
- レプリケーション耐クラッシュスレーブ
- レプリケーションマルチスレッドスレーブ
オープンソース 無料 コスト不要 使用範囲が広い、クロスプラットフォームサポートが良好、多种の言語呼び出しAPIを提供
データベース開発の学習に最適
二.MySQLのインストール
サーバー側のインストール
- サーバー側のインストール:端末に入力し、Enterキーを押して、プロンプトに従って入力
sudo apt-get install mysql-server
- 現在使用しているUbuntuイメージにはすでにMySQLサーバー側がインストールされており、再インストールする必要はありません。また、起動時に自動起動するように設定されています
- サーバーはクライアントのリクエストを受信し、SQLステートメントを実行し、データベースを管理します
- サーバー側は通常サービスとして管理され、名前はmysql
- サービスの起動
sudo service mysql start
- プロセスにmysqlサービスが存在するか確認
ps ajx|grep mysql
- サービスの停止
sudo service mysql stop
- サービスの再起動
sudo service mysql restart
設定
-
設定ファイルディレクトリは/etc/mysql/mysql.cnf
-
conf.dディレクトリに入り、mysql.cnfを開くと、設定がありません
-
mysql.conf.dディレクトリに入り、mysql.cnfを開くと、設定項目が表示されます
-
主な設定項目は次のとおり
bind-addressはサーバーがバインドするIPを示し、デフォルトは127.0.0.1
portはポートを示し、デフォルトは3306
datadirはデータベースディレクトリを示し、デフォルトは/var/lib/mysql
general_log_fileは通常ログを示し、デフォルトは/var/log/mysql/mysql.log
log_errorはエラーログを示し、デフォルトは/var/log/mysql/error.log
クライアント
- クライアントは開発者とDBAが使用し、ソケット方式でサーバーと通信します。一般的なものにはnavicat、コマンドラインmysqlがあります
グラフィカルインターフェースクライアントnavicat
- Navicat公式サイトからダウンロードできます
- 圧縮ファイルをUbuntu仮想マシンにコピーし、デスクトップに配置して解凍
tar zxvf navicat112_mysql_cs_x64.tar.gz
- 解凍したディレクトリに入り、次のコマンドを実行
./start_navicat
-
起動後の画面は以下の通り、詳細な機能は次のセクションを参照
-
「キャンセル」ボタンを2回クリックすると以下のようになります
-
「試用」ボタンをクリックすると以下のようになります
-
問題1:中国語文字化け
-
解決:start_navicatファイルを開く
export LANG="en_US.UTF-8"をexport LANG="zh_CN.UTF-8"に変更
- 問題2:試用期間
- 解決:ユーザーディレクトリの下の.navicat64ディレクトリを削除
cd ~
rm -r .navicat64
コマンドラインクライアント
- 端末で次のコマンドを実行し、プロンプトに従って情報を入力
sudo apt-get install mysql-client
- 現在使用しているUbuntuイメージにはすでにMySQLクライアントがインストールされており、再インストールする必要はありません
- 詳細な接続コマンドはヘルプドキュメントを参照できます
mysql --help
- 最も基本的な接続コマンドは次の通り、入力後Enterキーを押す
mysql -u root -pmysql
-
接続成功後のプロンプトは以下の通り
-
ログアウトするにはctrl+dまたは次のコマンドを入力
quit または exit
三.データの整合性
- データベースは1つの完全なビジネスユニットで、複数のテーブルを含むことができます。データはテーブルに保存されます
- テーブルにデータをより正確に保存し、データの正確性と有効性を保証するために、テーブルを作成する際にテーブルに強制検証を追加できます。データフィールドのタイプ、制約が含まれます
データ型
- ヘルプドキュメントを参照してすべてサポートされているデータ型を確認できます
- データ型を使用する原則は:必要な範囲内で、可能な限り小さい範囲を使用し、大きな範囲は使用しないようにし、これによりストレージスペースをより多く節約できます
- 一般的に使用されるデータ型は次のとおり:
- 整数:int、bit
- 小数:decimal
- 文字列:varchar、char
- 日付時刻: date、time、datetime
- 列挙型(enum)
- 特に説明する型は次のとおり:より完全なデータ型はhttp://blog.csdn.net/anxpp/article/details/51284106を参照してください
- decimalは浮動小数点数を示し、例えばdecimal(5,2)は合計5桁、小数点以下2桁を意味します
- charは固定長の文字列を示し、例えばchar(3)、'ab'を埋めると'ab 'という空白が補われます
- varcharは可変長の文字列を示し、例えばvarchar(3)、'ab'を埋めると'ab'が保存されます
- 文字列textは大テキストを保存し、文字数が4000を超える場合は推奨されます
- 画像、オーディオ、ビデオなどのファイルはデータベースに保存せず、サーバーにアップロードし、テーブルにこのファイルの保存パスを保存します
制約
- 主キーprimary key:物理的に保存される順序
- 非NULL not null:このフィールドはNULL値の入力を許可しません
- 一意unique:このフィールドの値は重複を許可しません
- デフォルトdefault:この値が入力されない場合、デフォルト値が使用されます。入力がある場合は入力内容が優先されます
- 外部キーforeign key:関係フィールドに対する制約で、関係フィールドに値を入力すると、関連テーブルでこの値が存在するかどうかを照会します。存在する場合は入力が成功し、存在しない場合は入力が失敗し、例外がスローされます
- 説明:外部キー制約はデータの有効性を保証できますが、データのCRUD(追加、変更、削除、照会)を行う際にデータベースのパフォーマンスが低下するため、推奨されません。ではデータの有効性はどう保証するか?答え:ロジック層で制御できます
数値型(一般的)
| 型 | バイトサイズ | 符号あり範囲(Signed) | 符号なし範囲(Unsigned) |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 |
| MEDIUMINT | 3 | -8388608 ~ 8388607 | 0 ~ 16777215 |
| INT/INTEGER | 4 | -2147483648 ~2147483647 | 0 ~ 4294967295 |
| BIGINT | 8 | -9223372036854775808 ~ 9223372036854775807 | 0 ~ 18446744073709551615 |
文字列
| 型 | バイトサイズ | 例 |
|---|---|---|
| CHAR | 0-255 | 型:char(3) 入力 'ab', 実際の保存は'ab ', 入力'abcd' 実際の保存は 'abc' |
| VARCHAR | 0-255 | 型:varchar(3) 入力 'ab', 実際の保存は'ab', 入力'abcd', 実際の保存は'abc' |
| TEXT | 0-65535 | 大テキスト |
日付時刻型
| 型 | バイトサイズ | 例 |
|---|---|---|
| DATE | 4 | '2020-01-01' |
| TIME | 3 | '12:29:59' |
| DATETIME | 8 | '2020-01-01 12:29:59' |
| YEAR | 1 | '2017' |
| TIMESTAMP | 4 | '1970-01-01 00:00:01' UTC ~ '2038-01-01 00:00:01' UTC |
四.Navicat接続
-
Navicatを開き、ツールバーの「接続」をクリックし、「mysql」を選択すると、ポップアップウィンドウが表示されます
-
ポップアップウィンドウで名前、ホストIP、ポート、ユーザー名、パスワードを入力します
-
パスワードはmysql
-
OKをクリックすると、左側のバーに先ほど入力した名前が表示され、ダブルクリックして接続を開きます
データベースの作成
-
左側のバーの空白部分を右クリックし、「新しいデータベース」を選択し、クリックします
-
入力を完了したら「OK」をクリックしてデータベースを作成し、左側に先ほど作成したデータベースが表示されます。ダブルクリックして開きます
データベースの編集
-
左側のバーのデータベースを右クリックすると、ポップアップメニューが表示されます
-
「データベースの編集」を選択すると、文字セット、ソートルールを変更できます
-
「SQLファイルにダンプ」を選択すると、構造とデータのバックアップが完了します
-
「データベースの削除」を選択すると、データベースを削除できます
テーブルの作成
-
ツールバーの「テーブル」をクリックし、2行目にテーブルに関するコマンドが表示されます。「テーブルの作成」をクリックします
-
新しいウィンドウがポップアップし、前のセクションの設計に従ってクラステーブルを作成し、各フィールドを入力し、対応する型を選択します
-
idフィールドはint型、符号なし、自動増加、主キー、非NULLに設定する必要があります
-
文字列型の場合、文字数を指定する必要があり、文字セット、ソートルールも指定する必要があります。デフォルトはデータベースと一致します
-
datetimeのデフォルト値はnow()に設定することも、具体的な値(例:'2000-1-1')に設定することもできます
-
同じ方法で学生テーブルstudentsを作成します
テーブルの編集
-
テーブルを選択すると、ツールバーの2行目の「テーブルを開く」、「テーブルを設計」、「テーブルを削除」が使用可能になります
-
テーブルを開くと、テーブルの現在のデータを確認できます。このウィンドウでデータを追加、変更、削除できます
-
テーブルを設計するのはテーブルを作成するウィンドウと同じで、フィールドを追加、変更、削除したり、フィールドの型、制約を編集したりできます
-
テーブルを削除すると、テーブルが物理的に削除されます
データの表示
- テーブルをダブルクリックするか、テーブルを選択してツールバーの2行目の「テーブルを開く」をクリックすると、テーブルのデータを表示できます
データの追加
-
デフォルトではデータがありません。対応する列にデータを入力し、下部のチェックマークをクリックして追加を完了します
-
注意:自動増加の主キー列には値を入力する必要はありません
-
もう一度データを追加する場合は、下部のプラスボタンをクリックすると、新しい空白行が表示され、データを入力できます
データの変更
- セルをクリックすると、値を編集でき、変更後、下部のチェックマークをクリックして有効になります
データの削除
-
セルをクリックし、下部のマイナスボタンをクリックすると、削除できます
-
説明:重要なデータの場合、物理的に削除するのではなく、isdelete属性を1に変更することを推奨します
五.コマンドラインスクリプト(重要)
コマンドライン接続
- 実際の業務では主にコマンド操作方式を使用し、記述を熟練する必要があります
- 端末を開き、次のコマンドを実行
mysql -uroot -p
Enterキーを押してパスワードを入力、現在設定されているパスワードはmysql
-
接続成功後の画面は以下の通り
-
ログアウトするにはquitとexit
-
または
-
ctrl+d
-
ログイン成功後、次のコマンドを入力して効果を確認
バージョンを表示:select version();
現在の時刻を表示:select now();
入力プロンプトの変更
prompt python>
- \D 完全な日付
- \U ユーザー名
データベース
- すべてのデータベースを表示
show databases;
- データベースを使用
use データベース名;
- 現在使用しているデータベースを表示
select database();
- データベースを作成
create database データベース名 charset=utf8;
例:
create database python charset=utf8;
- データベースを削除
drop database データベース名;
例:
drop database python;
テーブル
- 現在のデータベース内のすべてのテーブルを表示
show tables;
- テーブル構造を表示
desc テーブル名;
- テーブルを作成
- auto_incrementは自動増加を示します
CREATE TABLE table_name(
column1 datatype contrai,
column2 datatype,
column3 datatype,
.....
columnN datatype,
PRIMARY KEY(one or more columns)
);
例:クラステーブルの作成
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(10)
);
例:学生テーブルの作成
create table students(
id int unsigned primary key auto_increment not null,
name varchar(20) default '',
age tinyint unsigned default 0,
height decimal(5,2),
gender enum('男','女','人妖','保密'),
cls_id int unsigned default 0
)
- テーブルの変更-フィールドの追加
alter table テーブル名 add 列名 型;
例:
alter table students add birthday datetime;
- テーブルの変更-フィールドの変更:リネーム版
alter table テーブル名 change 元名 新名 型及び制約;
例:
alter table students change birthday birth datetime not null;
- テーブルの変更-フィールドの変更:リネームなし版
alter table テーブル名 modify 列名 型及び制約;
例:
alter table students modify birth date not null;
- テーブルの変更-フィールドの削除
alter table テーブル名 drop 列名;
例:
alter table students drop birthday;
- テーブルを削除
drop table テーブル名;
例:
drop table students;
- テーブルの作成ステートメントを表示
show create table テーブル名;
例:
show create table classes;
CRUD(作成、読み取り、更新、削除)
CRUDの説明: 作成(Create)、更新(Update)、読み取り(Retrieve)、削除(Delete)を表します
照会の基本使用
- すべての列を照会
select * from テーブル名;
例:
select * from classes;
- 指定された列を照会
- asを使用して列またはテーブルにエイリアスを指定できます
select 列1,列2,... from テーブル名;
例:
select id,name from classes;
追加
形式:INSERT [INTO] tb_name [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
- 説明:主キー列は自動増加ですが、全列挿入時にはプレースホルダが必要で、通常0またはdefaultまたはnullを使用してプレースホルダを設定し、挿入成功後は実際のデータが優先されます
- 全列挿入:値の順序はテーブル内のフィールドの順序に対応します
insert into テーブル名 values(...)
例:
insert into students values(0,'郭靖',1,'蒙古','2016-1-2');
- 部分列挿入:値の順序は指定された列の順序に対応します
insert into テーブル名(列1,...) values(値1,...)
例:
insert into students(name,hometown,birthday) values('黄蓉','桃花岛','2016-3-2');
- 上記のステートメントはテーブルに1行のデータを挿入できます。一度に複数行のデータを挿入することもでき、これによりデータベースとの通信を減らすことができます
- 全列複数行挿入:値の順序は指定された列の順序に対応します
insert into テーブル名 values(...),(...)...;
例:
insert into classes values(0,'python1'),(0,'python2');
insert into テーブル名(列1,...) values(値1,...),(値1,...)...;
例:
insert into students(name) values('杨康'),('杨过'),('小龙女');
更新
形式: UPDATE tbname SET col1={expr1|DEFAULT} [,col2={expr2|default}]...[where 条件判断]
update テーブル名 set 列1=値1,列2=値2... where 条件
例:
update students set gender=0,hometown='北京' where id=5;
削除
DELETE FROM tbname [where 条件判断]
delete from テーブル名 where 条件
例:
delete from students where id=5;
- 論理削除、本質的には更新操作です
update students set isdelete=1 where id=1;
バックアップ
- mysqldumpコマンドを実行
mysqldump –uroot –p データベース名 > python.sql;
# プロンプトに従ってmysqlのパスワードを入力
復元
- mysqlに接続し、新しいデータベースを作成
- 接続を終了し、次のコマンドを実行
mysql -uroot –p 新しいデータベース名 < python.sql
# プロンプトに従ってmysqlパスワードを入力
六.データベース設計
- リレーショナルデータベースはE-Rモデルに基づいて設計する必要があり、製品マネージャーの設計計画に基づいてモデルと関係を抽出し、テーブル構造を策定します。これはプロジェクトの開始第一歩です
- 開発には多くのデータベース設計ソフトウェアがあり、一般的なものにはpower designer、db desingerなどがあり、これらのソフトウェアを使用するとエンティティとエンティティ間の関係を直感的に確認できます
- データベースの設計は、専門のデータベース設計者が行うことも、開発グループのメンバーが行うこともあります。通常はプロジェクトマネージャーがメンバーを率いて完了します
- 現段階ではデータベース設計を独立して完了する必要はありませんが、この方面の経験を積むことに注意する必要があります
三つの正規化
- 研究と使用経験の総括を通じて、データベース設計に対していくつかの規範が提案され、これらの規範は正規化(Normal Form)と呼ばれています
- 現在確認できる正規化は合計8種類あり、通常3つの正規化を遵守するだけで十分です
- ◆ 第一正規化(1NF):列の原子性を強調し、列がさらにいくつかの列に分割できないことを意味します。 > このようなテーブルを考えてみましょう:【連絡先】(名前、性別、電話)実際のシナリオでは、1人の連絡先が家庭用電話と会社用電話を持つ場合、このテーブル構造設計は1NFに達していません。1NFに準拠するには、列(電話)を分割するだけで済みます。つまり:【連絡先】(名前、性別、家庭用電話、会社用電話)。1NFは簡単に識別できますが、2NFと3NFは混同しやすいです。
- ◆ 第二正規化(2NF):まず1NFであり、さらに2つの部分を含みます。1つはテーブルに主キーが存在すること、もう1つは主キーに含まれていない列が主キー全体に完全に依存し、主キーの一部にのみ依存できないことです。 > このような注文明細テーブルを考えてみましょう:【OrderDetail】(OrderID、ProductID、UnitPrice、Discount、Quantity、ProductName)。1つの注文で複数の製品を注文できることがわかっているため、単一のOrderIDだけでは主キーとして十分ではありません。主キーは(OrderID、ProductID)であるべきです。明らかにDiscount(割引)、Quantity(数量)は主キー(OderID、ProductID)に完全に依存(依存)していますが、UnitPrice、ProductNameはProductIDにのみ依存しています。したがってOrderDetailテーブルは2NFに準拠していません。2NFに準拠していない設計は冗長データを生成しやすくなります。
【OrderDetail】テーブルを【OrderDetail】(OrderID、ProductID、Discount、Quantity)と【Product】(ProductID、UnitPrice、ProductName)に分割することで、元の注文テーブルのUnitPrice、ProductNameの重複を排除できます。
- ◆ 第三正規化(3NF):まず2NFであり、さらに非主キー列が主キーに直接依存し、伝達依存が存在しないことです。つまり、非主キー列Aが非主キー列Bに依存し、非主キー列Bが主キーに依存するような状況が存在してはいけません。 > このような注文テーブルを考えてみましょう【Order】(OrderID、OrderDate、CustomerID、CustomerName、CustomerAddr、CustomerCity)主キーは(OrderID)。ここでOrderDate、CustomerID、CustomerName、CustomerAddr、CustomerCityなどの非主キー列はすべて主キー(OrderID)に完全に依存しているため、2NFに準拠しています。しかし問題はCustomerName、CustomerAddr、CustomerCityが直接依存しているのはCustomerID(非主キー列)であり、主キーに直接依存しているわけではないことです。これは主キーを介した伝達依存であるため、3NFに準拠していません。 【Order】を【Order】(OrderID、OrderDate、CustomerID)と【Customer】(CustomerID、CustomerName、CustomerAddr、CustomerCity)に分割することで3NFに達成できます。 *第二正規化(2NF)と第三正規化(3NF)の概念は混同しやすいですが、区別の鍵は2NF:非主キー列が主キー全体に完全に依存するか、主キーの一部にのみ依存するか;3NF:非主キー列が主キーに直接依存するか、非主キー列に直接依存するかです。
1NFに準拠しない例
2NFに準拠しない例
3NFに準拠しない例
最終テーブル
E-Rモデル
-
Eはエンティティを表し、エンティティの設計はクラスを定義するのと同じで、オブジェクトをどの側面から記述するかを指定します。1つのエンティティはデータベースの1つのテーブルに変換されます
-
Rは関係を表し、関係は2つのエンティティ間の対応ルールを記述します。関係のタイプには1対1、1対多、多対多が含まれます
-
関係もデータの一種であり、テーブルのフィールドを通じて保存する必要があります
-
エンティティAがエンティティBに対して1対1の場合、テーブルAまたはテーブルBにフィールドを作成し、もう一方のテーブルの主キー値を保存します
-
エンティティAがエンティティBに対して1対多の場合:テーブルBにフィールドを作成し、テーブルAの主キー値を保存します
-
エンティティAがエンティティBに対して多対多の場合:新しいテーブルCを作成し、このテーブルには2つのフィールドのみがあり、1つはエンティティAの主キー値を保存するために使用され、もう1つはエンティティBの主キー値を保存するために使用されます
-
考えてみてください:1対1、1対多、多対多の対応関係の例を挙げてください
論理削除
- 重要なデータの場合、物理的に削除したくありません。一度削除すると、データを元に戻すことはできません
- 削除方案:isDelete列を設定し、型はbit、論理削除を示し、デフォルト値は0
- 重要でないデータの場合、物理的に削除できます
- データの重要性は、実際の開発に基づいて決定されます
例
- 2つのテーブルを設計:クラステーブル、学生テーブル
- クラステーブルclasses
- id
- name
- isdelete
- 学生テーブルstudents
- id
- name
- birthday
- gender
- clsid
- isdelete
拡張読書
- 他人の設計規範を見てみましょう
- 58到家データベース30条軍規解読