建数据库原则

通常情况下,一个项目/应用建一个数据库

多表之间的建表原则

一对多 : 商品和分类

建表原则: 在多的一方添加一个外键,指向一的一方的主键 ​

多对多: 老师和学生, 学生和课程

建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表。

一对一: 班级和班长, 公民和身份证, 国家和国旗

建表原则: 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表

一对一在数据库中并没有任何意义,因为可以直接将两张表合并成一张表。但实际中也有使用,那就是拆表操作。

建表原则: 将两张表的主键建立起连接,让两张表里面主键相等

例如一个相亲网站的个人信息包括: 姓名,性别,年龄,身高,体重,三围,兴趣爱好,年收入, 特长,学历, 职业, 择偶目标,要求 等

将个人信息分为常用信息和不常用信息,减少表的臃肿。

案例分析

用户表 (用户的ID,用户名,密码,手机)

create table user(

uid int primary key auto_increment,

username varchar(31),

password varchar(31),

phone varchar(11)

);

insert into user values(1,'zhangsan','123','13811118888');

订单表 (订单编号,总价,订单时间 ,地址,外键用户的ID)

create table orders(

oid int primary key auto_increment,

sum int not null,

otime timestamp,//时间戳

address varchar(100),

uno int,

foreign key(uno) references user(uid)

);

insert into orders values(1,200,null,'黑马前台旁边小黑屋',1);

insert into orders values(2,250,null,'黑马后台旁边1702',1);

商品表 (商品ID, 商品名称,商品价格,外键cno)

create table product(

pid int primary key auto_increment,

pname varchar(10),

price double,

cno int,

foreign key(cno) references category(cid)

);

insert into product values(null,'小米mix4',998,1);

insert into product values(null,'锤子',2888,1);

insert into product values(null,'阿迪王',99,2);

insert into product values(null,'老村长',88,3);

insert into product values(null,'劲酒',35,3);

insert into product values(null,'小熊饼干',1,4);

insert into product values(null,'卫龙辣条',1,5);

insert into product values(null,'旺旺大饼',1,5);

订单项: 中间表(订单ID,商品ID,商品数量,订单项总价)

create table orderitem(

ono int,

pno int,

foreign key(ono) references orders(oid),

foreign key(pno) references product(pid),

ocount int,

subsum double

);

--给1号订单添加商品 200块钱的商品

insert into orderitem values(1,7,100,100);

insert into orderitem values(1,8,101,100);

--给2号订单添加商品 250块钱的商品 ()

insert into orderitem values(2,5,1,35);

insert into orderitem values(2,3,3,99);

商品分类表(分类ID,分类名称,分类描述)

create table category(

cid int primary key auto_increment,

cname varchar(15),

cdesc varchar(100)

);

insert into category values(null,'手机数码','电子产品,黑马生产');

insert into category values(null,'鞋靴箱包','江南皮鞋厂倾情打造');

insert into category values(null,'香烟酒水','黄鹤楼,茅台,二锅头');

insert into category values(null,'酸奶饼干','娃哈哈,蒙牛酸酸乳');

insert into category values(null,'馋嘴零食','瓜子花生,八宝粥,辣条');

外键的使用

在JAVA开发中到底要不要使用外键呢?在阿里的JAVA规范中也有下面这一条

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

但是为什么呢?

很多人会说:“每次做DELETE 或者UPDATE都必须考虑外键约束,会导致开发的时候很痛苦,测试数据极为不方便。”

外键的优点

一、数据一致性

由数据库自身保证数据一致性、完整性会更可靠,程序很难100%保证数据的一致性、完整性

二、ER图可靠性

有主外键的数据库设计可以增加ER图的可读性

外键的缺点

一、级联问题

阿里巴巴的开发手册中,就曾指出强制要求不允许使用外键,一切外键概念必须在应用层解决。 因为每次级联delete或update的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈

二、增加数据库压力

外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源

三、死锁问题

若是高并发大流量事务场景,使用外键还可能容易造成死锁

四、开发不方便

有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素

总结

一、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键。

二、如果为了高并发,分布式,使系统性能更优,以及更好维护,则一定不能使用外键

mysql 创建数据库 原则_MySQL数据库建立原则相关推荐

  1. mysql 创建查询 删除_MYSQL数据库查询删除创建企业基本知识

    数据查询语言(DQL)从表中获取数据 select  + where (位置)  order by(排序)  group by  haveby 查询用户:select user,host,passwo ...

  2. mysql创建gbk库_MYSQL创建utf-8和GBK格式数据库

    MYSQL创建utf-8格式的数据库 先mysql进入: 代码 GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chi ...

  3. mysql特殊字段名称_Mysql必读MySQL创建带特殊字符的数据库名称方法示例

    <MysqL必读MysqL创建带特殊字符的数据库名称方法示例>要点: 本文介绍了MysqL必读MysqL创建带特殊字符的数据库名称方法示例,希望对您有用.如果有疑问,可以联系我们. 文章抓 ...

  4. mysql 数据库名称 特殊字符_Mysql必读MySQL创建带特殊字符的数据库名称方法示例...

    <Mysql必读MySQL创建带特殊字符的数据库名称方法示例>要点: 本文介绍了Mysql必读MySQL创建带特殊字符的数据库名称方法示例,希望对您有用.如果有疑问,可以联系我们. MYS ...

  5. mysql 备份数据库原则_MySQL数据库备份方法说明

    MySQL数据库备份方法说明 更新时间:2007年07月29日 17:52:57   作者: 在数据库表丢失或损坏的情况下,备份你的数据库是很重要的.如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最 ...

  6. mysql数据库设计原则_mysql数据库设计总结

    作者:腾讯云技术社区 链接:https://www.zhihu.com/question/19719997/answer/154809252 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

  7. mysql删除原则_MySQL数据库的增删选查

    数据库是专门存储数据对象的容器,这里的数据对象包括表.视图.触发器.存储过程等,其中表是最基本的数据对象. 创建数据库 在 MySQL 数据库中存储数据对象之前,先要创建好数据库. 语法: creat ...

  8. mysql怎么删除表中字段的数据库表_Mysql 数据库 表 字段的创建 修改 删除

    MYSQL基础上机练习题(一) 数据库.表.字段的创建.修改.删除 一.实验目的: 创建.修改.删除数据库 创建.修改.删除表 创建.修改.删除字段 二.内容: 创建一个用于企业管理的员工管理数据库, ...

  9. mysql显示表已存在_MySQL数据库与数据表的相关操作

    数据库相关操作: 显示数据库:show databases; 如果是0.00秒并不代表没有花费时间,而是时间非常短,小于0.01秒. 创建数据库: Query OK表示创建成功,1行受到影响,处理时间 ...

  10. mysql特殊字符波浪号_mysql数据库特殊字符

    关于 mysql数据库特殊字符的搜索结果 回答 详细解答可以参考官方帮助文档 说明 部分RDS for MySQL实例的账号管理机制已升级.使用本文前,请先检查您的实例是否已升级,检查方式如下: 登录 ...

最新文章

  1. 必须认识的http请求包
  2. 解决在配置Oracle数据库连接错误问题
  3. 6个变态的C语言Hello World程序
  4. observable java_java源码阅读Observable(观察者模式)
  5. ASR开发工作笔记0002---认识iccid
  6. es创建索引库报错 :Types cannot be provided in put mapping requests, unless the include_type_na
  7. 15数码 java_A*算法求解15数码问题
  8. linux shell和配置文件的执行顺序
  9. c# 算式 计算器_C#计算器
  10. Linux基础知识点总结
  11. Echarts地图合并提取
  12. 作业三-读书app原型设计
  13. ThunderSoft Video to GIF Converter(电脑视频转gif软件)官方正式版V3.3.0 | 轻松将视频转换成GIF图片
  14. curl 504 php,nginx - PHP 经常提示 504 Gateway Time-out
  15. 利用电脑学象棋的一点想法
  16. UEditor自定义工具栏图标
  17. 互联网产品用户体验设计方法和用户体验优化方法
  18. 【Redis】Redis缓存穿透和雪崩
  19. Mac关闭“屏幕截图”和“清倒废纸篓”音效
  20. Hyperlegder Fabric监控:blockchain-explorer

热门文章

  1. html页面设置IE文档模式
  2. 2021年第四届计算机视觉与模式识别国际会议(CCVPR 2021) EI检索
  3. 1、域渗透基础简单信息收集
  4. 微软新专利“情绪衬衫”:读懂并安抚你的情绪
  5. 好用工具分享--推荐一个好用的跨平台的批量重命名文件或者文件夹工具【f2】
  6. 初识 Katalon Studio 自动化测试工具
  7. 汇智周刊第39期发布,2022年第27期!
  8. 【CentOS7(Linux)保姆级详细安装过程】
  9. 推荐算法评价指标(ACC、查全率、查准率、F1-Score、ROC、AUC,P-R)
  10. Apache个人用户主页设置