# 数据库整体设计规范
## 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()
#读取数据库
```