# 数据库整体设计规范 ## 1、设计 - 一般都使用INNODB存储引擎,除非读写比率<1%,才考虑使用MYISAM存储引擎;其他存储引擎请在DBA的建议下使用。 - Stored procedure (包括存储过程,函数,触发器)对于MYSQL来说还不是很成熟, 没有完善的出错记录处理,不建议使用。 - UUID(),USER()这样的MYSQL INSIDE函数对于复制来说是很危险的,会导致主备数据.不一致。所以请不要使用。如果一定要使用UUID作为主键,让应用程序来产生。 - 请不要使用外键约束,如果数据存在外键关系,请在程序层面实现。 - 如果应用使用的是长连接,应用必须具有自动重连的机制。但请避免每执行一个SQL去检查一次DB可用性。 - 如果应用使用的是长连接,应用应该具有连接的TIMEOUT检查机制,及时回收长时间没有使用的连接。TIMEOUT时间一般建议为20min。 - 我们所有的MySQL数据库除历史原因外,都必须采用UTF8编码。 - Mysql 对DDL支持很差,表结构推荐设计为Key-Value结构。如果是关系型结构的数据库,请尽量预留一些字段,如value1 ,value2 ,value3。 - Mysql用户名与数据库名字一样。 ## 2、命名 a) 命名应使用富有意义的英文词汇,多个单词组成的,中间以下划线分割。 b) 命名只能使用英文字母,数字和下划线。 c) 命名避免使用Mysql的保留字(详见附录A)和系统关键字。 d) 命名长度以不超过15个字符为宜(避免超过20)。 e) 命名全部采用小写,并且名称前后不能加引号。 # 数据库对象设计规范 ## 1、表设计 - 在设计时尽量包含两个日期字段:gmt_created(创建日期),gmt_modified(修改日期)且非空, 对表的记录进行更新的时候,必须包含对gmt_modified字段的更新。 - 必须要有主键,主键尽量用自增字段类型,推荐类型为INT或者BIGINT类型。 - 需要多表join的字段,数据类型保持绝对一致。 - Mysql的表尽量设置成KV(Key-Value)结构,这样便于扩展和维护。 - 当表的字段数非常多时,可以将表分成两张表,一张作为条件查询表,一张作为详细内容表(主要是为了性能考虑)。 - 当字段的类型为枚举型或布尔型时,建议使用char(1)类型。 - 同一表中,所有varchar字段的长度加起来,不能大于65535.如果有这样的需求,请使用TEXT/LONGTEXT类型。 - 由于MYSQL表DDL维护成本很高,所以在适当的时候,可以有一定的字段容余。 ## 2、表命名 a) 同一个模块的表尽可能使用相同的前缀,表名尽可能表达含义,例如: CRM_SAL_FUND_ITEM。 b) 字段命名应尽可能使用表达实际含义的英文单词或缩写, 如,公司ID,不要使用:corporation_id, 而用:corp_id 即可。 c) 布尔值类型的字段命名为is+描述。如member表上表示是否为enabled的会员的字段命名为IsEnabled。 # numpy数据存入数据库 ```python import numpy as np import pymysql as ml def insertData(numpy_bytes,shape_str): db = ml.connect(host="localhost", user="root", password="123456", db="test", port=3306) #连接数据库对象 cur = db.cursor() #游标对象 sql = "insert into face_data(numpy_data,shape) values(%s,%s)" #定义好sql语句,%s是字符串的占位符 try: cur.execute(sql,(numpy_bytes,shape_str)) #执行sql语句 db.commit() #提交到数据库中 except Exception as e: #捕获异常 raise e finally: db.close() # 关闭连接 def readData(): db = ml.connect(host="localhost", user="root", password="123456", db="test", port=3306) #连接数据库对象 cur = db.cursor() #游标对象 sql = "select * from face_data" #定义好sql语句,%s是字符串的占位符 try: cur.execute(sql) #执行sql语句 results = cur.fetchall() #获取所有结果集 for row in results: numArr = np.fromstring(string=row[1], dtype=int) #将读取到的字节流转化为ndarray数组 shape = tuple(eval(row[2])) #将读取到的shape转换为元组的格式,这里的eval(),由于我们元组里面的数据是int的所以,这里eval()的作用就是把本该是数字的转化回来 numArr.shape = shape #设置维度,设置的数值为元组 print(numArr) db.commit() #提交到数据库中 except Exception as e: #捕获异常 raise e finally: db.close() # 关闭连接 if __name__ == '__main__': arr =np.arange(0, 45).reshape(3,5,3) #生产0-45数字的维度=(3,5,3)的三维数组 shape_ = arr.shape #获取数组的维度 numpy_bytes = arr.tostring() #将数组转化为二进制流 shape_str = "".join(str(shape_)) #将shape元组转化为字符串 insertData(numpy_bytes, shape_str) #插入数据库 readData() #读取数据库 ```