数据库-库表设计 【分享一些库表设计经验】

MySQL之库表设计篇:一、二、三、四、五范式、BC范式与反范式详解! 在本篇中详细阐述了DB库表设计时的一些思想,也就是范式与反范式设计理论,这些理论仅仅只是一套方法论,实际开发过程中,还是需要根据业务来设计出最合适的结构。在文中提及了六种范式,但一般项目中仅需满足到第三范式或BC范式即可,因为这个度刚刚好,再往后就会因为过于精细化设计,导致整体性能反而下降。控制到第三范式的级别,一方面数据不会有太多冗余,第二方面也不会对性能影响过大。同时,如若打破范式的设定能对业务更有利,那也可以违背范式原则去设计。 阅读详情

本文的核心内容:记录积累一些库表设计方案与技巧

数据库实体与实体间的对应关系

1)数据库表的菜单【分类】设计:如省市关联、图书的一、二级分类。

2)数据库表设计之树形结构的表

3)表的简化方案(特定情况,例如,用户触发过的场景记录表)

4)数据库表设计之购物车,利用Session暂时存储购物车信息。


实体与实体间的对应关系

一对一

一对一,一般用于对主表的补充。假设A表为用户信息表,存储了用户的姓名、性别、年龄等基本信息。用户的家庭住址信息也属于用户的基本信息。我们可以选择将用户的家庭住址信息放到用户信息表,也可以单独建一张表,存储用户的家庭住址信息,以用户信息表的主键作为关联。

需不需要拆分取决:表信息的关联程度、表的字段个数限度。

一对多

一对多,是最常见的一种设计。就是 A 表的一条记录,对应 B 表的多条记录,且 A 的主键作为 B 表的外键。举几个  例子:

    1. 班级表 与 学生表,一个班级对应多个学生,或者多个学生对应一个班级。
    2. 角色表 与 用户表,一个角色对应多个用户,或者多个用户对应一个角色。
    1. 商品表 与 图片表,一个商品对应多张图片,或者多张图片对应一个商品。

多对多

构建一张关系表将两张表进行关联,形成多对多的形式。例如:

    1. 老师表、学生表;一个学生可以选修多个老师的课程、同时一个老师也可以教多个学生。
--教师表

CREATE TABLE #Teacher(TeacherId int, Name nvarchar(20));

INSERT INTO #Teacher VALUES(1, '张老师'), (2, '王老师');

--学生表

CREATE TABLE #Student(StudentId int, Name nvarchar(20));

INSERT INTO #Student VALUES(1, '小张'), (2, '小赵');

--老师学生关系表
CREATE TABLE #Teacher_Student(StudentId int, TeacherId int);

INSERT INTO #Teacher_Student VALUES(1, 1), (1, 2),(2, 1), (2, 2);

一:数据库表的菜单【分类】设计:如省市关联、图书的一、二级分类

BookType 一级分类:  少儿、外语、计算机

BookClass 二级分类: 少儿[0-2岁、3-6岁、7-10岁、11-14岁、儿童文学]

                                     外语[英语、日语、韩语、俄语、德语]

                                     计算机[计算机理论、计算机考试、数据库、人工智能、程序设计]

BookInf 图书详情 :    图书信息的详细字段。。。

基于以上关系:我们建表有两种方法

①:建立三张表 一级分类表,二级分类表、图书详情表

一级分类ID->作为二级分类的外键

二级分类ID->作为图书详情的外键

这一种依赖外键,实体模型也比较简单。(不再过多描述)

查询语句:可以采用 left join  on   或者  等值连接  将二级分类的外键与一级分类的主键等值连接即可查询。

②:建立两张表      一级分类和二级分类合并成一张表

                               图书详情表(引用TypeID为外键)

 

TypeID        指一级二级分类的ID(唯一标识、主键) 序列自增从1开始。

TypeName  指一级二级分类的名字

ParentID     指二级分类所属一级分类TypeID (若为一级分类则填”0”与二级分类加以区分)

countNumber     指一级图书包含二级图书的个数

                           二级分类所包含详细图书的个数

 

数据库查询一级分类信息的SQL

select typeid,typename,parentid,countnumber 
from t_booktype   where parentid='0'

数据查询二级分类信息(利用表的自连接)

select  child.typeid,child.typename,
child.parentid,child.countnumber 		
from t_booktype child ,t_booktype  parent 
where child.parentid=parent.typeid

二:MySQL 表中存储树形结构数据

由上面设计技巧引出,如果数据层级有多级呢?简言之就像一棵树一样,我们如何存储树形的数据到数据库。

存储父节点

存储于数据库中,最简单直接的方法,就是存储每个元素的父节点ID,即parent_Id->父节点Id。这种方式方便了插入,但是在某些情况下的查询会束手无策。我们可以增加两个字段(deep,is_leaf)帮助我们更快的查询。

deep=1表示父节点,deep>1 表示子节点。

id
parent_id
deep     //当前树的深度
is_leaf  //是否叶子节点

查询所有父节点deSQL如下:

select * from tree where deep=1

查询某个父节点下的所有子节点:

select * from tree where parent_id="" 

查询某个父节点下的所有后代节点,采用这种库表设计方式,这个需要依靠程序才能实现。

存储路径

将存储根结点到每个节点的路径,这种数据结构,可以一眼就看出子节点的深度。要插入自己,然后查出父节点的Path,并且把自己生成的ID更新到path中去。

如果要查询某个节点下的子节点,只需要根据path的路径去匹配,比如要查询D节点下的所有子节点。

select * from tree where path like '1/4/%'

总结

我建议存储树形结构可以将两者结合起来。

id
parent_id
deep     //当前树的深度
path     //根路径
is_leaf  //是否叶子节点

三:MySQL 表的简化(特定情况,例如:用户触发过的场景记录表)

假设业务中有N多道具,比如用户首次使用某个道具触发特效。根据表里有没有用户相关的道具触发记录来完成判断。

id
user_id //用户Id
item_id //道具ID
flag    //是否触发过特效 0-1
add_time
update_time

毫无疑问,上述表结构是能够满足并实现我们需求的,但是如果有20种道具,那么每个用户最终将有20条数据,数据冗余,如何简化?

解决方案:

定义道具枚举值

public enum ItemOnceFlagEnum {
    
    NONE(0),
    
    ITEM_ONE(1),//道具1
    
    ITEM_TWO(1 << 1), //道具2
    
    ITEM_Three(1 << 2), //道具3
    
    ;
    
    private int code;
    
    ItemOnceFlagEnum(int code) {
        this.code = code;
    }
    public int getCode() {
        return code;
    }
    
    public static ItemOnceFlagEnum valueOf(int code) {
        ItemOnceFlagEnum[] values = ItemOnceFlagEnum.values();
        for (ItemOnceFlagEnum flag : values) {
            if (flag.getCode() == code) {
                return flag;
            }
        }
        return NONE;
    }
}

建表

id
user_id //用户Id
flag    //是否触发过特效 2的0次幂、2的1次幂。。。
add_time
update_time

user_id设置为唯一索引

 判断是否使用过某道具与添加道具使用记录

    //判断是否使用过某项道具
    public static boolean isHasThisFlag(long flag, ItemOnceFlagEnum itemOnceFlagEnum) {
        return (flag & itemOnceFlagEnum.getCode()) > 0;
    }

    //添加道具使用记录
    public Result<Boolean> addOnceFlag(long userId, itemOnceFlagEnum flag) {
         ItemOnceFlagDO itemOnceFlagDO = itmeOnceFlagService.getOnceFlagMap(Collections.singletonList(userId));
         long calculateFlag = (Objects.isNull(blockOnceFlagDO) ? 0L : itemOnceFlagDO.getFlag()) | flag.getCode();
         itemOnceFlag.setFlag(calculateFlag);
         boolean res = itemOnceFlagService.addOrUpdateOnceFlag(itemOnceFlag);
    }

添加记录SQL

"INSERT INTO xxxx ( ) VALUES ( :1.userId,  :1.flag ) " +
            " ON DUPLICATE KEY UPDATE flag = :1.flag "

某一项道具为具体2次幂值(仅能够维护2种状态,有或无),flag代表所有触发道具2次幂和。

通过 (flag & itemOnceFlagEnum.getCode())>0  判断是否有某项道具

通过 flag | temOnceFlagEnum.getCode();  添加道具记录


四:购物车模块的库表设计

在电商软件,必不可少的模块就是购物车。

我分享两种设计方法:

①:维护一张购物车表,以用户ID为外键

一个用户一个购物车,用户注册成功的同时,为用户在购物车表内维护一个专属于用户的购物车。(根据我以前学到的知识,这一步可以为用户表创建Insert触发法器,当用户注册成功[触发器将用户ID作为外键插入购物车表],用户即拥有了唯一的购物车)

T_Car

字段

类型

说明

Car_ID

Varchar2(36)

购物车编号  主键

User_ID

Varchar2(36)

外键  用户唯一标识

Car_Status

Varchar2(4)

购物车状态

T_Shop_Item

字段

类型

说明

Shop_item_ID

Varchar2(36)

购物项编号  主键

Car_ID

Varchar2(36)

购物车编号 外键

Product_ID

Varchar2(36)

商品编号   外键

Count

Number(4)

数量

Price

number(8,2)

价格

ProductName

Varchar(30)

商品名

这么实现购物车的弊端:①:非该网站的注册用户无法将商品加入购物车。这与现实的情况不符合。一般我们访问某宝,某东,我们可以以游客的方式将商品加入购物车,直到下订单、付款时才要求我们必须登录。②:每个用户维护一下购物车似乎不太明智,顾客将商品加入购物车到下订单,完成交易,这一需求对数据库更改频繁。

②:所有用户共用一个”购物车”

我们可以直接以用户ID为标识,区分购物车商品所属的用户。

T_Shop_Item

字段

类型

说明

Shop_item_ID

Varchar2(36)

购物项编号  主键

User_ID

Varchar2(36)

用户编号 外键

ProductID

Varchar2(36)

商品编号   外键

Count

Number(4)

数量

Price

number(8,2)

价格

ProductName

Varchar(30)

商品名

即使减少了一张购物车表,但是这表还需要用户登录才能记录用户添加商品情况。

③:利用Session暂时存储购物车内的东西

[用户不登录就能添加商品到购物车;用户登录状态将Session中的信息存入非关系型数据库、关系型数据库。将购物车内的东西持久化存储]

明确一点:Session -> 一次会话有效(在用户不关闭浏览器的前提下,默认存在30分钟;用户关闭浏览器再次打开后,未登录用户的购物车将清空。)

解决如何用Session存储购物车内信息。

第一个难点:那么如何准确区分不同的商品? (自然是商品ID)

第二个难点:那么如何准确标记一个进入购物车的商品? (只有商品ID是不行的)

商品ID,通过商品ID,我们可以查询到商品详情。(价格、名称等等)

同一商品的购买数量。这一信息是不存在于商品详情的。【重点,不能忽略】

这两个信息必须存储。于是我想到Map(两个原因)。

①:存储两个值

Map<String,Integer> map=new HashMap<String,Integer>();

key存储 商品ID,  value存储 商品数量(购买数量)

②:保证商品ID(键)的唯一性

Map的特点:键唯一,值可以重复。我们以商品ID为键,这样就可以保证商品的唯一性。

我们再将map存入Session中就可以了。

当用户添加商品时,只需先从Session中取出map,迭代遍历判断key是否已经存在,若存在取value值加1;若不存在则将商品ID作为key,value数量默认为1,Put进map。

当用户(未登录)查看购物车时,只需从Session中取商品ID和数量,就可以显示购车内商品的详细信息,计算购物车内的商品总价格。

这种存储方式简化了添加商品进入购物车和删除购物车里商品的操作。但是却不得不再次封装一个Map对象将购物车详情页面的信息存储进去,以供购物车展示页面显示数据。

(这是我第一次考虑的存储方案,写到查看购物车详情页面才发现不合理之处。)

改进版本:

Map <String,Goods> map=new HashMap<String,Goods> ();

Key ->商品id

Value->购物车页面需要展示的商品详情(商品名、商品ID、商品数量、商品价格等)

核心:value值维护不再是一个商品数量,而是我们封装的模拟购物车实体对象

JSP页面的效果图

源代码:添加商品的Action

	//添加商品Action
	public String addToCar() throws Exception{
		//尝试从Session取出购物车
		ValueStack vs=ActionContext.getContext().getValueStack();
		Map<String,Goods> car=(Map<String,Goods>)vs.findValue("#session.car");
		
		BookService service=new BookServiceImpl();
		
		if(car==null){	
			//判断购物车是否存在
			//不存在则创建,将用户添加的商品加入Map 存入Session
			Map<String,Goods> map=new HashMap<String,Goods>();
			//查询数据将商品详情查询出出来,把我们感兴趣的属性封装到Goods实体中
			Book book=service.getSingleBook(bookid);
			Goods goods=new Goods();
			goods.setBookid(book.getBookid());
			goods.setCount(1);
			goods.setPrice(book.getPrice());
			goods.setCurrentprice(book.getCurrentprice());
			goods.setProductname(book.getProductname());
			
			map.put(bookid, goods);
			vs.setValue("#session.car", map);
		}else{		
			//判断用户添加的商品是否已经存在于购物车里
			//若存在根据key取出Goods->修改商品选购的数量
			//不存在则是首次添加,数量默认为1 ,将商品Put入map
			if(car.containsKey(bookid)){
				Goods product=car.get(bookid);
				product.setCount(product.getCount()+1);
			}else{			
				Book book=service.getSingleBook(bookid);
				Goods goods=new Goods();
				goods.setBookid(book.getBookid());
				goods.setCount(1);
				goods.setPrice(book.getPrice());
				goods.setCurrentprice(book.getCurrentprice());
				goods.setProductname(book.getProductname());				
				car.put(bookid, goods);
			}
		}	
		return Action.SUCCESS;
	}

两级分类的一种解决方案 场景:现在要做一个课程的添加和修改功能,但是每一个课程都对应了课程分类(比如:Web基础课程,属于一级分类-->后端开发;属于二级分类-->java)。我们在添加课程的时候,进行选择课程分类时,应该是先选一级分类,然后才能选择二级分类,修改课程时,要求回显数据时下拉框显示该课程对应的一级分类和二级分类,效果演示见图5。 阅读详情

相关推荐

21 个 MySQL 表设计的经验准则

作为后端开发,我们经常需要设计数据库表。今天给大家分享 21 个设计 MySQL 表的经验准则,希望对大家有所帮助。如果没有特殊的理由, 一般都建议将字段定义为NOT NULL。为什么呢?首先,NOT NULL可以防止出现空指针问题。其次,NULL值存储也需要额外的空间,它也会导致比较运算更为复杂,使优化器难以优化 SQL。NULL值有可能会导致索引失效。如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑, 那就可以将这个字段设置为NOT NULL。

m0_71777195的博客 476

数据库之多表设计

一、一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然。 有时候,为了业务,或者避免一张表中数据量过大,过复杂,在开发中会进行一对一方式来设计表。 二、 一对多(1方建主表(id为主键字段), 多方建外键字段) 一个实体的某个数据与另外一个实体的多个数据有关联关系, 一对多的关系在设计的时候,需要设计表的外键。 2.1. 班级表和学生表设计 部门表和员工表设计 image.png 2.2.创建数据库表 constraint 约束 foreign ke

weixin_61422097的博客 1万+

数据库架构设计——表结构设计

摘要 如何打造出一个能支撑海量的并发访问的分布式 MySQL 架构,本系列博文将从一下多个方面来分析有关MYSQL系统的架构设计相关原理。实际的业务为案例分析,分析实际业务中表使用的字段类型是如何选型,在介绍MySQL 中表的设计,比如表结构设计、访问设计、物理存储设计。通过模块一解决你表结构设计的痛点问题,让你打好架构设计最为基础的工作。 一、MySQL架构设计原理 1.1 表结构设计 实际的业务为案例分析,分析实际业务中表使用的字段类型是如何选型,在介绍MySQL 中表的设计,比如表结构设计、访

庄小焱 2万+

数据库表设计

字符类型和长度整数类型长度区别带符号和不带符号区别tinyint(1)还是选择tinyint(4)情况介绍场景可以存储0,1,2,3....9使用boolean类映射:0映射为false,1-9映射为true只存储0和1,表示true或false,则使用tinyint(1)。例如:业务字段中存在是否XX,即可这么设计在一定范围内可以存储,只不过这里4代表显示4位,只有带zerofill 时,查询的时候会自动向左边补0。

weixin_56163612的博客 4473

MySQL全国省市区三级联动表设计与查询优化实战

在后台管理系统中,省市区三级联动是常见需求,涉及行政区划数据的存储与查询。MySQL作为关系型数据库,通过合理的表结构设计(如邻接表加路径枚举)和索引优化,可以高效支持按父级查子级、按代码反查路径等操作。这种设计不仅提升查询性能,还便于维护区划变更。典型应用包括电商收货地址、CRM客户归属和物流分单。然而,数据导入时常因字符集或层级问题导致查询失败。本文分享从表设计到导入脚本的完整落库经验,助你避开常见坑点。

weixin_29574585的博客 242

Access数据库入门指南:从郝老师讲义到小型进销存实战

数据库管理系统是用于存储、检索和管理数据的软件,其核心原理包括表、查询、窗体和报表等组件。在办公自动化和教务管理等场景中,Access作为轻量级关系型数据库,能够帮助用户在不编写代码的情况下实现数据查询和报表生成。通过掌握表设计、查询编写和窗体报表制作,可以构建小型进销存系统,提升数据管理效率。本文基于郝老师Access视频教程讲义,拆解从建库到交付的最小路径,并分享避坑经验。

weixin_32288959的博客 70

工作中对数据库设计有什么经验

工作中对数据库设计有什么经验 以下描述仅仅是个人经验总结,仅供参考!!! 我认为数据库设计分为库和表的设计,所以从这两方面着手介绍。 库的设计 1、数据库名称要明确,可以加前缀或后缀的方式,使其看起来有业务含义,比如数据库名称可以为Business_DB(业务数据库)。 2、在一个企业中,如果依赖很多产品,但是每个产品都使用同一套用户,那么应该将用户单独构建一个库,叫做企业用户中心。 3、不同类型...

小白学python-就业班课程笔记 353

私有化大模型部署:企业AI应用的核心架构

私有化大模型部署不是“一次性项目”,而是企业AI的“长期主义”投资——它需要企业投入时间、金钱和精力,但回报是数据安全、定制化能力、核心竞争力的提升。就像“自家厨房”一样,私有化大模型可能初期麻烦,但一旦搭建起来,就能为企业“做”出符合自己口味的“特色菜”,而这些“特色菜”,正是企业在激烈竞争中的“护城河”。愿你能构建属于自己的“AI大脑”,让技术真正赋能业务,让复杂变简单,让深奥变通透。附录:私有化大模型部署架构图(注:可根据企业需求调整,此为通用架构)

AI天才研究院 1021

MYSQL数据库设计的一点总结

大大小小也搞过一些数据库设计,见过一些其他人的设计,看过些书,总结总结,经验谈。 选表类型: 大家都知道mysql的myisam表适合读操作大,写操作少;表级锁表 innodb表正好相反;行级锁表 互联网服务,不算支付性的服务外,互动产品,新闻系统等等一般都是读多,写少。用myisam表比较合适。 表的设计 定长表:所有列的字段长度都是定长的。可以去查mysql的手册不定长字段是V

dodott的专栏 1118

飞思卡尔16位单片机(二)——CodeWarrior开发环境搭建及新建、调试工程

一、安装CodeWarrior 飞思卡尔16位单片机的开发环境为CodeWarrior5.1,这个软件安装比较简单,软件的安装文件可以从相应的网站上下载。安装CodeWarrior所需要的电脑的硬件资源也比较宽泛,目前一般的电脑都可以满足这个要求,可以支持win10、win7等操作系统。安装过程按照按照软件的提示一步步操作即可。 二、安装USBDM驱动 USBDM是...

bigmarshal的博客 1万+

解决/usr/lib64/libstdc++.so.6和/lib64/libc.so.6版本过低问题

在CentOS7.0中编译好MySQL5.7.14之后,然后在CentOS6.5中初始化MySQL,执行:/usr/local/mysql/bin/mysqld --version出现如下问题:./bin/mysqld: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by ./bin/mysqld)

poxiaonie的博客 2万+

mysql 字段加减_MySQL 数据库开发常见问题及优化

作者:cyfonly链接:http://www.cnblogs.com/cyfonly/mysql 数据库是被广泛应用的关系型数据库,其体积小、支持多处理器、开源并免费的特性使其在 Internet 中小型网站中的使用率尤其高。在使用 mysql 的过程中不规范的 SQL 编写、非最优的策略选择都可能导致系统性能甚至功能上的缺陷。恰巧就在前几天,本人所在公司的云事业部举办了一场关于 my...

weixin_39624716的博客 163

基于51单片机的多功能计算器全套设计

当今社会,随着人们物质生活的不断提高,电子产品已经走进了家家户户,无论是生活或学习,还是娱乐和消遣几乎样样都离不开电子产品,大型复杂的计算能力是人脑所不能胜任的,而且人脑比较容易出错。计算器作为一种快速通用的计算工具方便了用户的使用。计算器可谓是我们最亲密的电子伙伴之一。本设计着重在于分析计算器设计开发过程中的环节和步骤,并从实践经验出发对计算器设计做了详细的分析和研究。 本设计是以STC89C52单片机为核心的计算器模拟系统设计,输入采用5×8矩阵键盘,可以进行加、减、乘、除等十几种数字运算,同时支持括号

runweipa的博客 1742

MySQL表设计的一些经验

设计MySQL表时,结合实际应用场景和实践,积累不少有用的经验,以下是一些关于MySQL表设计的经验分享:

vangoghlaam的博客 857

Ubuntu技巧-Ubuntu远程访问之SSH反向代理

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、互联网和自媒体。要把内网的一台的Ubuntu服务器让外面也能访问,总共有三种可行的方案,前面已经介绍了两种方式,今天就来介绍更健壮稳定的方式——ssh反向代理。大概的框架图如下,今天就从服务器购买到设置,手把手的教程,让你花费100块以内,就拥有一个强大的「云服务器」。

可夫小子的频道 1151

SDA 还是 SDI:SAP HANA 数据虚拟化与数据集成的取舍、组合与实战

结论先放在前面:SDA 面向数据虚拟化与联邦查询,强调不落地、不复制、按需实时访问;SDI 面向数据集成与复制,强调抽取、转换、装载与近实时增量同步。两者共享 Remote Source 与 Adapter 的理念,但侧重点与运行时组件明显不同。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 583

21个MySQL表设计的经验准则

作为后端开发,我们经常需要设计数据库表。整理了21个设计MySQL表的经验准则,分享给大家,大家看完一定会有帮助的。1.命名规范数据库表名、字段名、索引名等都需要命名规范,可读性高(一般要求用英文),让别人一看命名,就知道这个字段表示什么意思。比如一个表的账号字段,反例如下表名、字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,并且一般不使用英文缩写。主键索引名为pk_字段名;唯一索引名为uk_字段名;普通索引名则为idx_字段名。如果没有特殊的理由, 一般都建议将字段定义为。

xhbzl的博客 990

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)

这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。

2万+

MySQL表设计经验

表设计

qq_22201881的博客 745

FOC 电流采样方案对比(单电阻/双电阻/三电阻)

电流采样的作用 在FOC算法中,电流采样在反馈环节是相当重要的一部分,通常交流三相同步电机在进行坐标变换的时候,需要实时测量相电流,最终通过SVPWM实现电机转子磁场和定子磁场的同步转动,那么这里有三种方案,单电阻采样,双电阻采样,三电阻采样。本文参考ST的单电阻和三电阻采样以及TI的双电阻采样,结合实际中可能需要注意的地方进行总结分析。 单电阻采样 双电阻采样 三电阻采样 ...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 4万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【MySQL数据库开发设计规范】之表设计规范

在我们对数据库技术方案设计的时候,我们是否有自己的设计理念或者原则,还是更多的依据自己的直觉去设计,是否曾经懊悔线上发生过的一次低级故障,可能稍微注意点就可以避免,是否想过怎么才能很好的避免,规范的价值正是我们工作的检查清单,需要我们不断从错误中积累有效经验来指导未来的工作。本文介绍MySQL数据库开发设计规范之数据库表设计规范以及库设计规范。PS:以下规范在大型互联网公司经过了充分的验证,尤其适用于并发量大、数据量大的业务场景。以上介绍了在进行MySQL数据库表设计时,可以遵循的一些技术规范。

分享是一种境界,勤于分享,乐于分享! 1280

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据仓库建设方案和经验总结

在做数据集成的过程中,往往第二步的需求就是建设数仓由于数据分散在不同的存储环境或数据库中,对于新业务需求的开发需要人工先从不同的数据库中同步、集中、合并等处理,造成资源和人力的浪费。同时,目前的系统架构,无法为未来数据驱动业务创新的理念提供友好的支撑。

QEasycloud的博客 1975

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【MySQL】MySQL表设计的经验(建议收藏)

作为后端开发,我们经常需要设计数据库表。整理了21个设计MySQL表的经验准则,分享给大家,希望大家看完会有帮助。如果没有特殊的理由, 一般都建议将字段定义为 NOT NULL。为什么呢?首先,NOT NULL可以防止出现空指针问题。其次,NULL值存储也需要额外的空间的,它也会导致比较运算更为复杂,使优化器难以优化SQL。NULL值有可能会导致索引失效如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑, 那就可以将这个字段设置为NOT NULL。

Reische的博客 1万+

MySQL 性能优化终极指南:db-tutorial 实战经验分享

想要让你的 MySQL 数据库运行如飞?作为最流行的开源关系型数据库,MySQL 性能优化是每个开发者必须掌握的技能。本指南将基于 db-tutorial 项目的实战经验,为你揭示 MySQL 性能优化的核心技巧和最佳实践。 ## 为什么需要 MySQL 性能优化? 在当今数据驱动的时代,数据库性能直接影响用户体验和业务发展。慢查询不仅会让用户等待,还会占用宝贵的服务器资源。通过合理的 MyS

gitblog_00890的博客 830
上一篇: MyBatis笔记
下一篇: 初识Redis
Sugar_maps
博客等级 码龄11年 49粉丝 26原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值