zoukankan      html  css  js  c++  java
  • MySQL数据库建立原则

    建数据库原则

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

    多表之间的建表原则

    1. 一对多 : 商品和分类
      建表原则: 在多的一方添加一个外键,指向一的一方的主键 ​
    2. 多对多: 老师和学生, 学生和课程
      建表原则: 建立一张中间表,将多对多的关系,拆分成一对多的关系,中间表至少要有两个外键,分别指向原来的那两张表。

    多对多建表原则

    1. 一对一: 班级和班长, 公民和身份证, 国家和国旗
      建表原则: 将一对一的情况,当作是一对多情况处理,在任意一张表添加一个外键,并且这个外键要唯一,指向另外一张表

    一对一在数据库中并没有任何意义,因为可以直接将两张表合并成一张表。但实际中也有使用,那就是拆表操作。
    建表原则: 将两张表的主键建立起连接,让两张表里面主键相等

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

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

    案例分析

    商场数据库

    • 用户表 (用户的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的时候,都要级联操作相关的外键表,不论有没有这个必要,由其在高并发的场景下,这会导致性能瓶颈
    二、增加数据库压力
    外键等于把数据的一致性事务实现,全部交给数据库服务器完成,并且有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源
    三、死锁问题
    若是高并发大流量事务场景,使用外键还可能容易造成死锁
    四、开发不方便
    有外键时,无论开发还是维护,需要手工维护数据时,都不太方便,要考虑级联因素

    • 总结

    一、如是单机且低并发,也不需要性能调优,再或者不能用程序保证数据的一致性,完整性,可以使用外键。
    二、如果为了高并发,分布式,使系统性能更优,以及更好维护,则一定不能使用外键

    https://blog.csdn.net/qq_22136439/article/details/103714369
    https://zhuanlan.zhihu.com/p/62020571

  • 相关阅读:
    SysUtils.UpperCase、SysUtils.LowerCase 大小写转换
    Sql Server 2005 数据库备份还原后出现“受限制用户”问题的解决
    为什么要跪谢
    【基础】C#卸载快捷方式添加
    DataTable 复制 DataRow 出现 “该行已经属于另一个表”错误的解决办法
    将int型转化成五位字符串,前面用0填充
    C#嵌套类的使用方法及特性(转)
    net内存回收与Dispose﹐Close﹐Finalize方法(转)
    sqlhelper中文注释版(转)
    windows2003消息队列的安装
  • 原文地址:https://www.cnblogs.com/zllk/p/13555241.html
Copyright © 2011-2022 走看看