例如:使用数据库创建外键约束:
CREATE TABLE `m_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `user_name` varchar(50) NOT NULL DEFAULT ‘‘ COMMENT ‘用户名‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `m_order` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `total_price` decimal(10,2) NOT NULL DEFAULT ‘0.00‘, `user_id` int(11) NOT NULL DEFAULT ‘0‘, PRIMARY KEY (`id`), CONSTRAINT `for_indx_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
不使用数据库创建外键约束:
CREATE TABLE `m_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `user_name` varchar(50) NOT NULL DEFAULT ‘‘ COMMENT ‘用户名‘, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `m_order` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘主键‘, `total_price` decimal(10,2) NOT NULL DEFAULT ‘0.00‘, `user_id` int(11) NOT NULL DEFAULT ‘0‘, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.避免使用触发器
-
- 触发器是一个隐藏的存储过程,因为它不需要参数,不需要显示调用,往往在你不知情的情况下已经做了很多操作,无形中增加了系统的复杂性。
- 涉及到复杂的逻辑的时候,触发器的嵌套是避免不了的,如果再涉及几个存储过程,再加上事务等等,很容易出现死锁现象。
- 存储过程的致命伤在于移植性,存储过程不能跨库移植,在后期系统升级维护时难度加大。
4.谨慎使用预留字段
-
- 无法准确的知道预留字段的类型。
- 无法知道预留字段中所存储的内容。
- 后期维护预留字段的成本高。
建议:
- “按需设计”,在经过详细有效的分析之后,在数据表中只放置必要的字段,而不要留出大量的备用字段。
- 如果数量很少,而且信息的性质与原表密切相关,那么就可以直接在原表上动态增加字段,并将相关的数据更新进去
- 如果数量较大,或者并非是原表对象至关重要的属性,那么就可以新增一个表,然后通过键值连接起来。
4.反范式化设计。
-
- 什么是反范式化?
- 适当的违反的范式的要求,允许少量的数据冗余,用空间换取时间。
- 优点:增加查询效率。
- 什么是反范式化?
数据库设计优化
标签:库类 _id pgsql 参考 设计 触发器 log 之间 范围