什么是范式:符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。
简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些
规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
使用范式检查数据表设计合理性
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小
范式级别:
第一范式 1st NF
如果每列都是不可再分的最小数据单元,则满足 第一范式的目标是确保每列的原子性
实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨 别,但是 2NF 和 3NF 就容易搞混淆。
第二范式 2nd Nf
如果一个关系满足1 NF,并且除了主键以外的其他列都完全以来该主键,则满足 第二范式要求每个表只描述一件事情
eg:游戏的编号、名称、难度、得分、用户等,将其分为基本和难度两个表 ,基本表里面存放编号、名称,第二张表存放用户、得分、难度。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 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多次重复的情况。
第三范式 3rd NF
如果一个关系满足2NF,并且除了主键以外的 其他列都不传递依赖于主键列,则满足
第三范式不存在冗余
考虑一个订单表【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。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
什么是约束:
约束是用来限定表中数据准确性、完整性、一致性、联动性的一套规则。在Mysql中,约束保存在information_schema数据库的table_constraints中,可以通过该表查询约束信息。如下图:
1.主键约束:保证实体完整性 建表的时候在字段后面加 PRIMARY KEY
eg: id int(5) NOT NULL PRIMARY KEY
2.外键约束:保证引用完成性 如果ID为2的没有,就不能引用id为2的其他字段 建表的时候在字段后面加 REFERENCES
外键约束是保证一个或两个表之间的参照完整性,外键是构建于一个表的两个字段或是两个表的两个字段之间的参照关系。
也就是说从表的外键值必须在主表中能找到或者为空。 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据, 然后才可以删除主表的数据
eg:create table scores( id int(2)NOT NULL REFERENCES user(id),//如果user表里面没有这个ID,则scores这张表就不能引用该ID )
3.检查约束:保证域完整性 建表的时候在字段后面加 CHECK(字段>0)
eg:create table games( gno int(4) NOT NULL CHECK(gno>0) //建立一种规定,游戏编号大于0,
gname varchar(10) NOT NULL , gtype varchar(20) NOT NULL )
4.默认约束:保证域完整性 建表的时候在字段后面加 DEFAULT '男'
5.自增列:保证实体完整性 建表的时候在字段后面加 AUTO_INCREMENT
eg:create table use( id int(2)NOT NULL PRIMARY KEY AUTO_INCREMENT )
6.unique
unique代表唯一约束。唯一约束是指定table的列或列组合不能重复,保证数据的唯一性。
虽然唯一约束不允许出现重复的值,但是可以为多个null,同一个表可以有多个唯一约束,多个列组合的约束。
在创建唯一约束的时候,如果不给唯一约束名称,就默认和列名相同。
MySQL会给唯一约束的列上默认创建一个唯一索引;
添加约束 ALTER TABLE t2 ADD CONSTRAINT uq_id2_id3 UNIQUE(id2,id3) ;
可以看到Mysql会自动添加一个唯一索引。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PHP操作MySQL
1,mysql_connect() - 建立数据库连接格式: resource mysql_connect([string hostname [:port] [:/ path / to / socket] [,string username] [,string password]])
例如 : $ conn = @mysql_connect “本地主机”, “用户名”, “口令”)or die( “不能连接到MySQL服务器”); 说明:使用该连接必须显示的关闭连接
2,mysql_pconnect() -建立数据库连接 格式: 资源mysql_pconnect([字符串主机名[:端口] [:/路径/到/插座] [,用户名字符串] [,串密码]])
例: $康恩= @mysql_pconnect( “本地主机”, “用户名”, “口令”)or die(”不能连接到Mysql Server“); 说明:使用该连接函数不需要显示的关闭连接,它相当于使用连接池
3,mysql_close() - 关闭数据库连接
例如: $ conn = @mysql_connect(”localhost“,”用户名”, ” 密码“)or die(”不能连接到Mysql服务器“);
4,mysql_select_db() - 选择数据库格式: 布尔值mysql_select_db(string db_name [,resource link_id])
例如 : $ conn = @mysql_connect(“localhost”,“username”,“password”)或者die(“不能连接到Mysql Server “);
@mysql_select_db(“MyDatabase”)或die(“不能选择这个数据库,或数据库不存在”);
5,mysql_query() - 查询MySQL 格式: 资源mysql_query(字符串查询,[resource link_id])
例如 : $ linkId = @mysql_connect(“localhost”,“username”,“password”)或die(“不能连接到Mysql Server “);
@mysql_select_db( “MyDatabase的” )或die(“不能选择这个数据库,或者数据库不存在”); $ query =“select * from MyTable”;
说明:若SQL查询执行成功,则返回资源标识符,失败时返回FALSE。若执行更新成功,则返回TRUE,否则返回FALSE
6,mysql_db_query() - 查询MySQL
格式: 资源mysql_db_query ,string query [,resource link_id])
例如 :
$ linkId = @mysql_connect(“localhost”,“username”,“password”)或die(“不能连接到MysqlServer”);
$ query =“select * from MyTable”;
$ result = mysql_db_query(“MyDatabase”,$ query);
mysql_close();
说明:为了使代码清晰,不推荐使用这个函数调用
7,mysql_result() - 获取和显示数据格式: mixed mysql_result(resource result_set,int row [,mixed field])
例子: $ query =“select ID,名称来自MyTable按名称排序“;
for($ count = 0; $ count <= mysql_numrows($ result); $ count ++)
{
$ c_id = mysql_result($ result,0,“id”);
$ c_name = mysql_result($ result,0,“name”);
echo $ c_id,$ c_name;
}
说明:最简单,也是效率最低的数据获取函数
8,mysql_fetch_row() - 获取和显示数据格式: 数组mysql_fetch_row(资源结果集)
例如 : $ query =“选择ID,名称来自MyTable按名称排序”;
$ result = mysql_query($ query);
while(list($ id,$ name)= mysql_fetch_row($ result))
{
echo(“Name:$ name($ id)<br />”);
}
说明:函数从result_set中获取整个数据行,将值放在一个索引数组中。通常会结束list()函数使用
9,mysql_fetch_array() - 获取和显示数据
例如
$ query =“select id,MyTable按名称排序的名称”;
$ result = mysql_query($ query);
while($ row = mysql_fetch_array($ result,MYSQL_ASSOC)){
$ id = $ row [“id”];
$ name = $ row [“name”];
echo “名称:$ name($ id)<br />”;
}
10,mysql_fetch_assoc() - 获取和显示数据
格式: array mysql_fetch_assoc(resource result_set) 相当于调用mysql_fetch_array(resource,MYSQL_ASSOC);
11,mysql_fetch_object() - 获取和显示数据 格式: object mysql_fetch_object(resource result_set)
例子: $ query =“select id,name from MyTable order by name”;
while($ row = mysql_fetch_object($ result)){
$ id = $ row-> id; $ name = $ row-> name;
echo“名称:$ name($ id)<br />”; }
说明:返回一个对象,在操作上与mysql_fetch_array()相同
12,mysql_num_rows() - 所选择的记录的个数格式: int mysql_num_rows(resource result_set)
例如 : query =“select id,name from MyTable where id> 65" ;
echo“有”.mysql_num_rows($结果)。“条记录的ID大于65”;
说明:只在确定选择查询所获取的记录数时才有用
13,mysql_affected_rows() - 受插入,更新,删除影响的记录的个数
格式: int mysql_affected_rows([resource link_id])
例子: $ query =“update MyTable set name ='CheneyFu'where id> = 5”;
$ result = mysql_query($ query);
echo“ID大于等于5的名称被更新的记录数:”。
说明:该函数获取受INSERT,UPDATE或DELETE更新语句影响的行数
14,mysql_list_dbs() - 获取数据库列表信息
格式: 资源mysql_list_dbs([resource link_id])
例子: mysql_connect(“localhost”,“username”,“password”);
$ dbs = mysql_list_dbs();
echo “数据库:$dbs<br />”;
说明:显示所有数据库名称
15,mysql_db_name() - 获取数据库名
格式: string mysql_db_name(resource result_set,integer index)
说明:该函数获取在mysql_list_dbs()所返回的result_set中位于指定索引索引的数据库名
16,mysql_list_tables () - 获取数据库表列表
格式: resource mysql_list_tables(string database [,resource link_id])
例如 : mysql_connect(“localhost”,“username”,“password”);
$ tables = mysql_list_tables(“MyDatabase”);
while(list($ table)= mysql_fetch_row($ tables)){
echo“$ table <br />”;
}
说明:该函数获取数据库中所有表的表名
17,mysql_tablename() -表数据库名
格式: 字符串mysql_tablename(资源result_set,整数指数)
例: mysql_connect(“本地主机”,“用户名”,“密码”);
$ tables = mysql_list_tables(“MyDatabase”);
$ count = -1;
while(++ $ count <mysql_numrows($ tables)){
echo mysql_tablename($ tables,$ count)。“<br />”;
}
说明:该函数获取mysql_list_tables()所返回result_set中位于指定索引索引的表名
18,的mysql_fetch_field() -字段信息
格式: 对象的mysql_fetch_field(资源结果[摘要field_offset])
例:mysql_connect( “本地主机”, “用户名密码”);
mysql_select_db( “MyDatabase的”);
$query =“select * from MyTable”;
$ result = mysql_query($ query);
$counts = mysql_num_fields($ result); for($ count = 0; $ count <$ counts; $ count ++){
$ field = mysql_fetch_field($ result,$ count);
echo “<p> $ field-> name $ field-> type($ field-> max_length)</ p>”;
}
说明: 返回的对象共有12个对象属性:
名称:字段
名表:字段所在的表
max_length:字段的最大长度
not_null:如果字段不能为null,则为1,否则0
primary_key:如果字段为主键,则为1,否则为0 0
unique_key:如果字段是唯一键,则为1,否则为0
multiple_key:如果字段为非唯一,则为1,否则为0
numeric:如果字段为数值则为1,否则为0
blob:如果字段为BLOB则为1,否则为0
类型:字段的数据类型
unsigned:如果字段为无符号数则为1,否则为0
zerofill:如果字段为“零填充”则为1,否则为0
19,mysql_num_fields() - 获取查询的字段个数格式: integer mysql_num_fields(resource result_set)
20,mysql_list_fields() -指定表的所有字段的字段名
格式: 资源mysql_list_fields(串DATABASE_NAME,串TABLE_NAME [,资源link_id])
21,mysql_field_flags() - 获取指定的字段选项
格式: 字符串mysql_field_flags(资源result_set,整数field_offset)
22,整数mysql_field_len(资源result_set,整数field_offset)
说明: 如果mysql_field_len($reseult,0)= 16777215 那么numer_format(mysql_field_len( result))等于16,777,215
23,mysql_field_name() - 获取字段名
格式: 字符串mysql_field_name(资源result_set,int field_offset)
格式:
字符串mysql_field_type(资源result_set,int field_offset)例如
:
$ query =“选择ID,名称从MyTable按名称排序”;
$ result = mysql_query($ query);
$ row = mysql_fetch_row($ result);
echo mysql_field_type($ result,0); //结果:int
25,mysql_field_table() - 获取字段所在表格格式: string mysql_field_table(resource result_set,int field_offset)例如 : $ query =“选择id作为PKID,名称来自MyTable order by name”; $ result = mysql_query($ query); $ row = mysql_fetch_row($ result); echo mysql_field_table($ result,0); //
1,mysql_connect() - 建立数据库连接格式: resource mysql_connect([string hostname [:port] [:/ path / to / socket] [,string username] [,string password]])
例如 : $ conn = @mysql_connect “本地主机”, “用户名”, “口令”)or die( “不能连接到MySQL服务器”); 说明:使用该连接必须显示的关闭连接
2,mysql_pconnect() -建立数据库连接 格式: 资源mysql_pconnect([字符串主机名[:端口] [:/路径/到/插座] [,用户名字符串] [,串密码]])
例: $康恩= @mysql_pconnect( “本地主机”, “用户名”, “口令”)or die(”不能连接到Mysql Server“); 说明:使用该连接函数不需要显示的关闭连接,它相当于使用连接池
3,mysql_close() - 关闭数据库连接
例如: $ conn = @mysql_connect(”localhost“,”用户名”, ” 密码“)or die(”不能连接到Mysql服务器“);
4,mysql_select_db() - 选择数据库格式: 布尔值mysql_select_db(string db_name [,resource link_id])
例如 : $ conn = @mysql_connect(“localhost”,“username”,“password”)或者die(“不能连接到Mysql Server “);
@mysql_select_db(“MyDatabase”)或die(“不能选择这个数据库,或数据库不存在”);
5,mysql_query() - 查询MySQL 格式: 资源mysql_query(字符串查询,[resource link_id])
例如 : $ linkId = @mysql_connect(“localhost”,“username”,“password”)或die(“不能连接到Mysql Server “);
@mysql_select_db( “MyDatabase的” )或die(“不能选择这个数据库,或者数据库不存在”); $ query =“select * from MyTable”;
说明:若SQL查询执行成功,则返回资源标识符,失败时返回FALSE。若执行更新成功,则返回TRUE,否则返回FALSE
6,mysql_db_query() - 查询MySQL
格式: 资源mysql_db_query ,string query [,resource link_id])
例如 :
$ linkId = @mysql_connect(“localhost”,“username”,“password”)或die(“不能连接到MysqlServer”);
$ query =“select * from MyTable”;
$ result = mysql_db_query(“MyDatabase”,$ query);
mysql_close();
说明:为了使代码清晰,不推荐使用这个函数调用
7,mysql_result() - 获取和显示数据格式: mixed mysql_result(resource result_set,int row [,mixed field])
例子: $ query =“select ID,名称来自MyTable按名称排序“;
for($ count = 0; $ count <= mysql_numrows($ result); $ count ++)
{
$ c_id = mysql_result($ result,0,“id”);
$ c_name = mysql_result($ result,0,“name”);
echo $ c_id,$ c_name;
}
说明:最简单,也是效率最低的数据获取函数
8,mysql_fetch_row() - 获取和显示数据格式: 数组mysql_fetch_row(资源结果集)
例如 : $ query =“选择ID,名称来自MyTable按名称排序”;
$ result = mysql_query($ query);
while(list($ id,$ name)= mysql_fetch_row($ result))
{
echo(“Name:$ name($ id)<br />”);
}
说明:函数从result_set中获取整个数据行,将值放在一个索引数组中。通常会结束list()函数使用
9,mysql_fetch_array() - 获取和显示数据
例如
$ query =“select id,MyTable按名称排序的名称”;
$ result = mysql_query($ query);
while($ row = mysql_fetch_array($ result,MYSQL_ASSOC)){
$ id = $ row [“id”];
$ name = $ row [“name”];
echo “名称:$ name($ id)<br />”;
}
10,mysql_fetch_assoc() - 获取和显示数据
格式: array mysql_fetch_assoc(resource result_set) 相当于调用mysql_fetch_array(resource,MYSQL_ASSOC);
11,mysql_fetch_object() - 获取和显示数据 格式: object mysql_fetch_object(resource result_set)
例子: $ query =“select id,name from MyTable order by name”;
while($ row = mysql_fetch_object($ result)){
$ id = $ row-> id; $ name = $ row-> name;
echo“名称:$ name($ id)<br />”; }
说明:返回一个对象,在操作上与mysql_fetch_array()相同
12,mysql_num_rows() - 所选择的记录的个数格式: int mysql_num_rows(resource result_set)
例如 : query =“select id,name from MyTable where id> 65" ;
echo“有”.mysql_num_rows($结果)。“条记录的ID大于65”;
说明:只在确定选择查询所获取的记录数时才有用
13,mysql_affected_rows() - 受插入,更新,删除影响的记录的个数
格式: int mysql_affected_rows([resource link_id])
例子: $ query =“update MyTable set name ='CheneyFu'where id> = 5”;
$ result = mysql_query($ query);
echo“ID大于等于5的名称被更新的记录数:”。
说明:该函数获取受INSERT,UPDATE或DELETE更新语句影响的行数
14,mysql_list_dbs() - 获取数据库列表信息
格式: 资源mysql_list_dbs([resource link_id])
例子: mysql_connect(“localhost”,“username”,“password”);
$ dbs = mysql_list_dbs();
echo “数据库:$dbs<br />”;
说明:显示所有数据库名称
15,mysql_db_name() - 获取数据库名
格式: string mysql_db_name(resource result_set,integer index)
说明:该函数获取在mysql_list_dbs()所返回的result_set中位于指定索引索引的数据库名
16,mysql_list_tables () - 获取数据库表列表
格式: resource mysql_list_tables(string database [,resource link_id])
例如 : mysql_connect(“localhost”,“username”,“password”);
$ tables = mysql_list_tables(“MyDatabase”);
while(list($ table)= mysql_fetch_row($ tables)){
echo“$ table <br />”;
}
说明:该函数获取数据库中所有表的表名
17,mysql_tablename() -表数据库名
格式: 字符串mysql_tablename(资源result_set,整数指数)
例: mysql_connect(“本地主机”,“用户名”,“密码”);
$ tables = mysql_list_tables(“MyDatabase”);
$ count = -1;
while(++ $ count <mysql_numrows($ tables)){
echo mysql_tablename($ tables,$ count)。“<br />”;
}
说明:该函数获取mysql_list_tables()所返回result_set中位于指定索引索引的表名
18,的mysql_fetch_field() -字段信息
格式: 对象的mysql_fetch_field(资源结果[摘要field_offset])
例:mysql_connect( “本地主机”, “用户名密码”);
mysql_select_db( “MyDatabase的”);
$query =“select * from MyTable”;
$ result = mysql_query($ query);
$counts = mysql_num_fields($ result); for($ count = 0; $ count <$ counts; $ count ++){
$ field = mysql_fetch_field($ result,$ count);
echo “<p> $ field-> name $ field-> type($ field-> max_length)</ p>”;
}
说明: 返回的对象共有12个对象属性:
名称:字段
名表:字段所在的表
max_length:字段的最大长度
not_null:如果字段不能为null,则为1,否则0
primary_key:如果字段为主键,则为1,否则为0 0
unique_key:如果字段是唯一键,则为1,否则为0
multiple_key:如果字段为非唯一,则为1,否则为0
numeric:如果字段为数值则为1,否则为0
blob:如果字段为BLOB则为1,否则为0
类型:字段的数据类型
unsigned:如果字段为无符号数则为1,否则为0
zerofill:如果字段为“零填充”则为1,否则为0
19,mysql_num_fields() - 获取查询的字段个数格式: integer mysql_num_fields(resource result_set)
20,mysql_list_fields() -指定表的所有字段的字段名
格式: 资源mysql_list_fields(串DATABASE_NAME,串TABLE_NAME [,资源link_id])
21,mysql_field_flags() - 获取指定的字段选项
格式: 字符串mysql_field_flags(资源result_set,整数field_offset)
22,整数mysql_field_len(资源result_set,整数field_offset)
说明: 如果mysql_field_len($reseult,0)= 16777215 那么numer_format(mysql_field_len( result))等于16,777,215
23,mysql_field_name() - 获取字段名
格式: 字符串mysql_field_name(资源result_set,int field_offset)
格式:
字符串mysql_field_type(资源result_set,int field_offset)例如
:
$ query =“选择ID,名称从MyTable按名称排序”;
$ result = mysql_query($ query);
$ row = mysql_fetch_row($ result);
echo mysql_field_type($ result,0); //结果:int
25,mysql_field_table() - 获取字段所在表格格式: string mysql_field_table(resource result_set,int field_offset)例如 : $ query =“选择id作为PKID,名称来自MyTable order by name”; $ result = mysql_query($ query); $ row = mysql_fetch_row($ result); echo mysql_field_table($ result,0); //
注:部分函数转自CSDN博客,