数据库设计

2018-04-10  本文已影响0人  大猪厂

一、数据库设计

用户模块

用户表 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
上一篇下一篇

猜你喜欢

热点阅读