[转]数据库外键

外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用:

  1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制,且不能轻易地水平扩展;若是把数据一致性的控制放到事务中,也即让应用服务器承担此部分的压力,而引用服务器一般都是可以做到轻松地水平的伸缩;

2.传统行业
1>.软件应用的人数有限,换句话说是可控的;
2>.数据库服务器的数据量也一般不会超大,且活跃数据有限;

综合上述2句话描述,也即数据库服务器的性能不是问题,所以不用过多考虑性能的问题;另外,使用外键可以降低开发成本,借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新;
最后一点,使用外键的方式,还可以做到开发人员和数据库设计人员的分工,可以为程序员承担更多的工作量;

为何说外键有性能问题:
1.数据库需要维护外键的内部管理;
2.外键等于把数据的一致性事务实现,全部交给数据库服务器完成;
3.有了外键,当做一些涉及外键字段的增,删,更新操作之后,需要触发相关操作去检查,而不得不消耗资源;
4.外键还会因为需要请求对其他表内部加锁而容易出现死锁情况;

数据库的诸多设计,帐号,权限,约束,触发器,都是为 C/S 结构设计的,是以 C 端不可信做为假设前提的。B/S 模式安全边界前移到 web 服务层,应用与数据库之间是可信的,应用自行完成这些功能更加灵活。所以能不用就不用。

以上内容转自知乎-大家设计数据库时使用外键吗

MySQL表结构及开发数据同步方法

结构同步

方法一: 线上建独立开发库-适合团队
– 每次有表结构变动都提交到指定的人-然后更新到开发库中
– 每次开发前先同步开发库的表结构

方法二: 本地文件夹-适合个人

____________________
|--alterUpdate.sh
|--full
|--20180203
|--|--alter.sql
|--|--lock.mysql
|--20180206
|--|--alter.sql
|___________________

如果有更新结构语句, 侧以当天日期建立sql脚本.
每次开发前先执行alterUpdate.sh脚本, 脚本先判断所有日期的文件夹里面是否都有lock.mysql如果全部有侧直接执行full的sql脚本,
如果有日期文件夹中的没有lock.mysql侧先执行然后生成lcok.mysql再导出数据库全部结构语句, 再覆盖到full中的sql脚本里.

数据同步

开发的时候有些配置数据和分类的数据需要预先存入数据库的.

  • 自动增加不可用来做更新条件判断

场景: 页面需要获取”手机-小米”下的所有产品. 现在在分类增加一条小米的分类数据.

分类表结构: id pid title name, 关键字段 name 字符串-英语组合-不可重复

同步规则: 先判断小米的name是否存在, 再获取手机的id,做为准备插入小米分类数据的pid

github-tag包下载很慢处理方法

eg: https://github.com/mysql/mysql-server/tags 下载MySQL的源码包

方法一: 通过搜索最近的DNS服务器

下载会转到 github-cloud.s3.amazonaws.com 这服务器下载, 站长之家-DNS查询 离我们最近的服务器, 然后把IP粘贴到本机的HOSTS文件中.

52.216.20.16 github-cloud.s3.amazonaws.com

方法二: 把github导出然到国内的git平台中下载.

eg: 利用码云的git平台, 导入后再tag中下载包

相关资料

mysql-社区版下载

docker-mysql-server启动后外部无法访问

1.启动mysql-server:5.6镜像.

docker run --name my-container-name -e MYSQL_ROOT_PASSWORD=root123 -d -p 3306:3306 mysql/mysql-server:5.6

2.在宿机上使用mysql客户端或使用Navicat连接-出现下面信息 PS:如 mysql -h 公网IP -u user -p pass
ERROR 1130 (HY000): Host ‘xxx. xxx. xxx’ is not allowed to connect to this MySQL server

处理此问题
下面命令: 查看容器ID, 进入指定mysql服务器的容器中, 在容器使用mysql客户端进入mysql.将root的host更改为%(可任意机器访问) 刷新权限. 退出mysql 即出容器.

docker ps
docker exec -it <容器ID> bash
mysql -u root -proot123
> SELECT host, user FROM mysql.user;
> SELECT host, user FROM mysql.user;
> flush privileges;
> exit;
exit;

再测试连接, Success!

相关资料

docker-library/mysql-issue
docker-mysql-server