mysql开发数据库命名规范问题


数据库名 小写。
表名 前缀_小写。

那么字段名:
我看到一个资料是这么说的:
一种推荐的命名规则是:在定义数据库、表、列的时候全部采用小写字母加下划线的方式,不使用任何大写字母。

大家认可么?是这么操作的么?
虽然大小写无所谓,我只是想看看最佳的规范。

数据库 web php mysql sql

乃心明眼亮 9 years, 7 months ago

我的(多年前同事教的,原本还有后缀 info,relation 来区别表类型,还有二级主题默认为base,我觉查看表列表时排序乱给去掉了):

表名由"分区 模块 主题[_二级主题]"组成, 推荐最多两级主题.
分区分别为:
a: 应用区, 存放应用数据
b: 仓库区, 存放历史数据
m: 市场区, 存放结果数据
s: 缓冲区, 存放缓冲数据
字段名推荐:
id 主键, CHAR(20)
pid 父键, CHAR(20)
xx_id 外键, CHAR(20), xx为关联表缩写
dflag 删除标识, TINYINT, 0为正常, 1为删除, 可用其他数字表示其他状态
ctime 创建时间, DATETIME或TIMESTAMP
mtime 修改时间, DATETIME或TIMESTAMP
btime 开始时间, DATETIME或TIMESTAMP
etime 结束时间, DATETIME或TIMESTAMP

FIRST answered 9 years, 7 months ago

先找种命名方式用吧,以后觉得不妥的时候,下次设计改就行了。听别人说,总知道这样好,却又体会不到为啥,没意思。
我一般是所有命名都是小写,oracle貌似对大写比较钟情,mysql经常你写的大写,最后还会转成小写,伤心了,就不用大写了。
表名:模块前缀_表名;历史表名:模块前缀_表名_his;
字段名:主键就叫id;普通字段就是名称,没有前缀;如果是外键:外键所在表的表名_外键在原表中的字段名称

busad answered 9 years, 7 months ago

认可采用小写加下划线的方式。
表名方式: 【项目名_模块名_表名】 我们就是这样写的。
要是觉得太长了,也可以去掉项目名称,数据库名字就是项目名称。

夜樱四重奏 answered 9 years, 7 months ago

这是去哪儿内部的一个分享ppt
去哪儿MySQL开发规范.pdf: http://vdisk.weibo.com/s/dR8G_5nKajgp

看以参照下,不过每个都有自己的规范,相对而言有个约束有利于协作

Cybunny answered 9 years, 7 months ago

我认为表像这么设计的话, 各个表的关系一目了然. 我认为最烂的表就是comment表引用了user表的user_id, 在comment表却叫u_id, 这尼玛真是让人蛋疼.

MySQL关键字最好大写, 记得为每个字段写注释, 更严格的话, 为每个字段加上 反引号


 DROP DATABASE IF EXISTS guodou;
CREATE DATABASE guodou;
use guodou;

DROP TABLE IF EXISTS user;
CREATE TABLE user(
    user_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_nickname VARCHAR(20) NOT NULL COMMENT "昵称",
    user_email VARCHAR(100) NOT NULL COMMENT "注册邮箱",
    user_passwd CHAR(32) NOT NULL COMMENT "密码, MD5",
    user_avatar CHAR(32) NULL COMMENT "头像, MD5",
    user_desc TEXT NULL COMMENT "个人简介",
    user_website VARCHAR(200) NULL COMMENT "个人网站",
    user_gender CHAR(1) NOT NULL DEFAULT "O" COMMENT "性别, M=Man, W=woman, O=other",
    user_ctime TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT "创建日期",
    user_isadmin CHAR(1) NOT NULL DEFAULT "N" COMMENT "是否为管理员, Y=是, N=否",
    UNIQUE KEY(user_nickname),
    UNIQUE KEY(user_email)
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="用户表";

DROP TABLE IF EXISTS product;
CREATE TABLE product(    
    product_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL COMMENT "产品名称",
    product_path VARCHAR(80) NULL COMMENT "所属类别path",
    product_price FLOAT(10, 2) NOT NULL DEFAULT 0.00 COMMENT "价格",
    product_currency CHAR(5) NOT NULL DEFAULT "RMB" COMMENT "币种",
    product_from VARCHAR(20) NOT NULL COMMENT "来源, 比如天猫, 京东, fancy",
    product_from_url VARCHAR(1024) NOT NULL COMMENT "来源URL",
    product_like_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT "该产品有多少喜欢",
    product_img_dir CHAR(32) NOT NULL COMMENT "存放该产品的所有图片的目录名, MD5",
    product_brand VARCHAR(50) NULL COMMENT "品牌",
    user_id INT UNSIGNED NOT NULL COMMENT "用户ID"
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="产品表";

DROP TABLE IF EXISTS comment;
CREATE TABLE comment(
    comment_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    comment_content TEXT NOT NULL COMMENT "评论内容",
    comment_ctime TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT "发布该评论时间",
    comment_ref INT UNSIGNED NULL COMMENT "所引用的评论ID, 即comment_id",
    comment_poke_count INT UNSIGNED NOT NULL DEFAULT 0 COMMENT "被点赞多少次",
    product_id INT UNSIGNED NOT NULL COMMENT "产品ID",
    user_id INT UNSIGNED NOT NULL COMMENT "用户ID"
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="评论表";

DROP TABLE IF EXISTS pokelog;
CREATE TABLE pokelog(
    comment_id INT UNSIGNED NOT NULL COMMENT "评论ID",
    user_id INT UNSIGNED NOT NULL COMMENT "用户ID"
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="点赞log";

DROP TABLE IF EXISTS likelog;
CREATE TABLE likelog(
    product_id INT UNSIGNED NOT NULL COMMENT "产品ID",
    user_id INT UNSIGNED NOT NULL COMMENT "用户ID"
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="喜欢log";

DROP TABLE IF EXISTS tag;
CREATE TABLE tag(
    tag_name VARCHAR(50) NULL COMMENT "标签",
    comment_id INT UNSIGNED NOT NULL COMMENT "评论ID",
    product_id INT UNSIGNED NOT NULL COMMENT "产品ID",
    user_id INT UNSIGNED NOT NULL COMMENT "用户ID"
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="用户为某产品做出评论所使用的标签";

DROP TABLE IF EXISTS choiceness;
CREATE TABLE choiceness(
    choiceness_date DATE NOT NULL COMMENT "Y-M-D, 每日精选",
    user_id INT UNSIGNED NOT NULL DEFAULT 0 COMMENT "操作人, 0=系统程序, >0即为用户ID",
    product_id INT UNSIGNED COMMENT "产品ID",
    INDEX(choiceness_date)
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="精选的产品, 将放于首页";

DROP TABLE IF EXISTS hot;
CREATE TABLE hot(
    hot_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT "创建日期",
    product_id INT UNSIGNED COMMENT "产品ID",
    INDEX(hot_date)
)ENGINE=MyISAM AUTO_INCREMENT=100000000 DEFAULT CHARSET=utf8 COMMENT="热门的产品";

alucart answered 9 years, 7 months ago

我是PHPer,个人比较偏向于全部使用小写+下划线的方式,不过所在公司项目使用的规范是库名和表名使用小写+下划线,字段名使用小驼峰命名方式,我猜测使用小驼峰作为字段命名规范主要目的是为了跟代码的变量命名规范保持一致。

真剣勝負こDは answered 9 years, 7 months ago

MySQL 区分大小写的策略是这样的:

  1. 表名 库名 是跟随系统的,就是说 Windows 不区分,Linux 区分,MAC 根据文件系统的格式化选项可以区分也可以不区分,默认不区分。
  2. 字段名 不区分

我们平时看到的 SQL 语句中的 大写 关键词 全部都是徒劳,MySQL 会把它们全部转换成小写再入库查询。

HeyMoon answered 9 years, 7 months ago

Your Answer