数据库设计
一、数据库设计
用户模块
用户表 user.User
用户ID、用户名、密码、邮箱、权限、激活
继承自django的AbstractUser类,在settings.py中添加配置信息AUTH_USER_MODEL = 'users.User'
地址表 users.Address
地址ID、用户id(外键)、手机号、收件人、地址、邮编
商品模块
商品SKU表 goods.GoodsSKU
商品SKU id、名字、简介、价格、单位、库存、类别ID(外键)、商品spu id(外键)、图片url:冗余字段:以控件缓时间,查询url就可以查询到这张图片,不需要再到数据库中查询、销量0:每次下订单+=1、上下架 -0/1
商品SPU表 goods.Goods
商品spu id、名字、详情
商品类别表goods.GoodsCategory
类别id、名字、logo、图片
图片表 goods.GoodsInage
图片ID、url、商品 sku id
首页轮播商品表 IndexGoodsBanner
id、图片、url、index
首页分类商品表 IndexCategoryGoodsBanner
id、商品 spu id、类别id、type = 1、index
购物车模块
redis存放购物车数据
# redis 知识复习
# 启动 redis server
sudo service redis start
# 停止 redis server
sudo service redis stop
# 重启 redis server
sudo service redis restart
# 进入redis shell
redis-cli
# 测试
ping ---> 返回pang
redis数据库没有名字,默认有16个,编号0-15,使用select1来切换数据库;
redis是key-value类型的数据库,每一条数据都是一个键值对;
redis的Key是字符串类型,不能重复;
redis的value有五种类型:string、Hash、list、set、zset;
# keys *
type key
del key
exist key
expire key seconds
ttl key
# string
set key value
get key
# hash
hset key field value
hget key field
# list
lpush/rpush key value
lrange key start stop
# set
sadd key member1 member2
smembers key
# zset
zadd key score1 member1 score2 member2
zrange key start stop
zrangebyscore key min max
redis 与 python交互
from redis import *
if __name__=='__main__':
try:
sr = StrictRedis()
result = sr.set("key", "value")
# 输出响应结果,如果添加成功则返回True,不成功则返回False
print(result)
result1 = sr.get("key")
# 输出键的值,如果键不存在则返回None
print(result1)
result2 = sr.delete("key")
# 输出响应结果,如果成功则返回受影响的键数,如果不成功则返回0
print(result2)
key_list = sr.keys()
# 返回所有键组成的列表
print(key_list)
except Exception as e:
print(e)
订单模块
订单数据表OrderInfo
order_id(自增)、订单id、数量*、价格(总价)、用户id、时间、地址id、付款方式、邮费、状态
订单商品表 OrderGoods
id、order_id、sku_id、数量、历史单价、价格(总价)、评论
基类
BaseModel中包含两个通用字段
from django.db import models
class BaseModel(models.Model):
"""为模型类补充字段"""
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
# verbose_name: admin站点显示的名字
update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间")
class Meta:
abstract = True # 说明是抽象模型类
数据库的主从
mysql数据库主从服务器的通信是基于二进制的日志文件bin.log
master做出动作,通过bin.log传入slave
数据库的配置
主从服务器配置
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'dailyfresh',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'mysql'
},
'slave':{
'ENGINE':'django.db.backends.mysql',
'NAME':'dailyfresh',
'HOST':'127.0.0.1',
'PORT':3306,
'USER':'root',
'PASSWORD':'mysql'
}
}
数据库路由配置
配置完成主从数据库服务器之后,为了让django服务器能都分别调用这两个服务器,需要配置分离路由器
# /util/db_router.py
class MasterSlaveDBRouter(object):
def db_for_read(self, model, **hints):
return "slave"
def db_for_write(self, model, **hints):
return "default"
def allow_relation(self, obj1, obj2, **hints):
return True
使用分离路由器,在配置文件settings.py中添加配置:
DATABASE_ROUTERS = ['utils.db_router.MasterSlaveDBRouter']
导入mysql
# __init__.py
import pymysql
pymysql.install_as_MySQLdb()
安装应用
在配置文件settings中安装应用
import sys
sys.path.insert(1,os.path.join(BASE_DIR,'apps'))
# Application definition
INSTALLED_APPS = (
...
'haystack',
'users',
'goods',
'orders',
'cart',
)
MysQL知识复习
RDBMS:关系型数据库管理系统,关系模型,用二维表存储数据;
关系型:每一行纪录都拥有相同的字段,多个表有关联的关系,一个表的某一列引用另一张表的数据;
MySQL特点:支持多种操作系统,开源免费;
SQL语言:SQL是一种特殊的语言,专门用来操作关系型数据库,不区分大小写;
mysql -uroot -pmysql
quit/exit/ctra+d
# 默认四个数据库:
information
mysql
performance
sys
# 数据完整性
数据类型:数值类型(int)、字符串、小数;
# 约束
非空 not null
唯一 unique
默认 default
主键 primary key
外键 foreign key
show databases;
use mysql;
select database();
create database python charset=utf-8;
drop database python;
show tables;
desc hero;
create table stu(
id int primary key not null auto_increment,
name varchar(10)
);
alter table stu add aged int;
alter table stu change aged age int;
alter table stu modify age varchar;
alter table stu drop age;
select * from hero;
insert into hero value