第四章 广告投放系统——数据库设计与实体类
此博客用于个人学习,来源于网上,对知识点进行一个整理。
1. SpringBoot 与 MVC:
IOC 作为 SpringBoot 的核心之一,先简单看一下它的原理。
更多内容可以参考这篇博客:Spring 框架学习第三节:核心理念之一 —— IoC(控制反转)
以及了解 Spring MVC 的模块解析:
更多内容可以参考这篇博客:Spring MVC 框架学习第一节:MVC 的基本概念和入门
2. 数据表设计:
2.1 分析系统层级关系:
先介绍一下广告投放系统的一些基本概念和一些基本功能点,也就是广告投放系统里面要做什么事情,包含什么功能。
首先介绍四个概念:
- 用户账户:最高层级,用于定义广告主或代理商,只有有了用户才会有接下来的数据投放
- 推广计划 :一类品牌或产品广告投放的规划,自身并不定义太多关于广告自身的信息,它会将信息打包下放到推广单元层级
- 推广单元:一个确定的广告投放策略,描述了投放广告的规则信息,推广计划与推广单元是一对多的关系
- 推广单元维度限制:推广单元一般会做一些限制级别的动作,比如:关键词限制,只有广告词带有一些关键词才会命中推广单元;地域限制,上海的居民会看到上海的商品的广告信息;兴趣限制,喜欢篮球的更多推送体育方面的广告
- 广告创意:展示给用户看到的数据,可以是图片、文本或者一段视频,推广单元和广告创意是多对多的关系
接下来看一下四个概念的层级关系:
- 最高层级是推广账户级别,只有有了用户账户,才能在我们的平台上推广计划
- 第二层级是推广计划,一个推广计划一般是一个品牌,每个推广计划都有一些推广单元,是父子关系
- 第三层级是推广单元,分为关键词,地域,兴趣和人群,一个推广单元也被称为维度
- 最低层级是创意,创意也是一个单独的层级,它其实与任何一个层级相关联,同时它与推广单元是多对多的关系,每一个推广单元都可以去添加一个创意,每个创意也可以添加到推广单元上面,两者是多对多的
2.2 数据表设计:
数据表的设计与广告数据的核心要素是相对的,目的就是去表达各个要素。但是,数据表中的数据字段与类型定义是可以“自 由发挥”的,这需要与当前的具体业务进行匹配。
用户账户表:
用户账户(ad_user) | 含义 |
---|---|
username | 账户名称 |
token | 账户 token |
user_status | 账户状态 |
create_time | 创建时间 |
update_time | 更新时间 |
推广计划表:
推广计划(ad_plan) | 含义 |
---|---|
user_id | 标记当前记录所属用户 |
plan_name | 推广计划名称 |
plan_status | 推广计划状态 |
start_date | 推广计划开始时间 |
end_date | 推广计划结束时间 |
create_time | 创建时间 |
update_time | 更新时间 |
其中,推广的有效时间为推广计划的开始时间到结束时间,如果不属于这段时间,推广单元也就没有了意义。
推广单元与维度限制表:
推广单元(ad_unit) | 含义 |
---|---|
plan_id | 关联推广计划 id |
unit_name | 推广单元名称 |
unit_status | 推广单元状态 |
position_type | 广告位类型(开屏,贴片等) |
budget | 预算 |
create_time | 创建时间 |
update_time | 更新时间 |
关联词限制(ad_unit_keyword) | 含义 |
---|---|
unit_id | 关联推广单元 id |
keyword | 关键词 |
地域限制(ad_unit_it) | 含义 |
---|---|
unit_id | 关联推广单元 id |
province | 省 |
city | 市 |
兴趣限制(ad_unit_district) | 含义 |
---|---|
unit_id | 关联推广单元 id |
it_tag | 兴趣标签 |
创意、创意与推广单元关联关系表:
创意(ad_creative) | 含义 |
---|---|
name | 创意名称 |
type | 物料类型(图片,视频) |
material_type | 物料子类型(bmp,avi) |
height | 高度 |
width | 宽度 |
size | 物料大小,单位 KB |
duration | 持续时长,视频不为0 |
audit_status | 审核状态 |
user_id | 标记当前所属用户 |
url | 物料地址 |
create_time | 创建时间 |
update_time | 更新时间 |
创意与推广单元关联(createive_unit) | 含义 |
---|---|
creative_id | 关联创意 id |
unit_id | 关联推广单元 id |
3. 广告投放系统模块:
在 imooc-ad-service 下,创建 module:ad-sponsor。
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 指定父pom, 注意它是 imooc-ad-service 的子模块 --><parent><artifactId>imooc-ad-service</artifactId><groupId>com.imooc.ad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><!-- 当前项目/模块的坐标, groupId从父模块中继承 --><artifactId>ad-sponsor</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><!-- 引入 Web 功能 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><!-- 引入 Feign, 可以以声明的方式调用微服务 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!-- 引入服务容错 Hystrix 的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><!-- 引入服务消费者 Ribbon 的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency><!-- Java Persistence API, ORM 规范 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- 数据库连接 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- MySQL 驱动, 注意, 这个需要与 MySQL 版本对应 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.12</version><scope>runtime</scope></dependency><!-- 通用模块 --><dependency><groupId>com.imooc.ad</groupId><artifactId>ad-common</artifactId><version>1.0-SNAPSHOT</version></dependency><!-- apache 提供的一些工具类 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency></dependencies><!--SpringBoot的Maven插件, 能够以Maven的方式为应用提供SpringBoot的支持,可以将SpringBoot应用打包为可执行的jar或war文件, 然后以通常的方式运行SpringBoot应用--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml:
server:port: 7000servlet:context-path: /ad-sponsor #Controller 的前缀spring:application:name: eureka-client-ad-sponsorjpa:show-sql: true #是否打印 SQL 语句hibernate:ddl-auto: none #手动创建表,主动控制权会更高properties:hibernate.format_sql: true #是否对 SQL 语句进行格式化open-in-view: false #在懒加载的时候,如果找不到一些 bean 的配置会导致错误,所以设置为 falsedatasource:url: jdbc:mysql://127.0.0.1:3306/imooc_ad_data?autoReconnect=trueusername: rootpassword: roottomcat:max-active: 4 #最大连接数min-idle: 2 #最小空闲连接数initial-size: 2 #初始化连接eureka:client:service-url:defaultZone: http://server1:8000/eureka/
启动类:
@EnableFeignClients
@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication
public class SponsorApplication {public static void main(String[] args) {SpringApplication.run(SponsorApplication.class,args);}
}
3.1 实体类1——用户表:
在建立该实体类之前,需要建立一个枚举类,用于构造 token。
@Getter
public enum CommonStatus {VALID(1,"有效状态"),INVALID(0,"无效状态");private Integer status;private String desc;CommonStatus(Integer status,String desc){this.status = status;this.desc = desc;}
}
建立实体类:
//实现get,set
@Data
//无参构造函数
@NoArgsConstructor
//全参构造函数
@AllArgsConstructor
//实体类
@Entity
//对应的数据库表
@Table(name = "ad_user")
public class AdUser {//主键并且使用自增策略@Id@GeneratedValue(strategy = GenerationType.IDENTITY)//对应的字段为id,并且不能为空@Column(name = "id",nullable = false)private Long id;//基本属性@Basic//对应的字段为username,并且不能为空@Column(name = "username",nullable = false)private String username;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "token",nullable = false)private String token;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "user_status",nullable = false)private Integer userStatus;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "create_time",nullable = false)private Date createTime;//基本属性@Basic//对应的字段为token,并且不能为空@Column(name = "update_time",nullable = false)private Date updateTime;//传入的参数只有 username 和 tokenpublic AdUser(String username,String token){this.username = username;this.token = token;this.userStatus = CommonStatus.VALID.getStatus();this.createTime = new Date();this.updateTime = this.createTime;}
}
3.2 实体类2——推广计划表:
建立实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_plan")
public class AdPlan {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id",nullable = false)private Long id;@Basic@Column(name = "user_id", nullable = false)private Long userId;@Basic@Column(name = "plan_name", nullable = false)private String planName;@Basic@Column(name = "plan_status", nullable = false)private Integer planStatus;@Basic@Column(name = "start_date", nullable = false)private Date startDate;@Basic@Column(name = "end_date", nullable = false)private Date endDate;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "update_time", nullable = false)private Date updateTime;public AdPlan(Long userId, String planName,Date startDate, Date endDate) {this.userId = userId;this.planName = planName;this.planStatus = CommonStatus.VALID.getStatus();this.startDate = startDate;this.endDate = endDate;this.createTime = new Date();this.updateTime = this.createTime;}
}
3.3 实体类3——推广单元表:
建立实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit")
public class AdUnit {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "plan_id", nullable = false)private Long planId;@Basic@Column(name = "unit_name", nullable = false)private String unitName;@Basic@Column(name = "unit_status", nullable = false)private Integer unitStatus;/** 广告位类型(开屏, 贴片, 中贴...) */@Basic@Column(name = "position_type", nullable = false)private Integer positionType;@Basic@Column(name = "budget", nullable = false)private Long budget;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "update_time", nullable = false)private Date updateTime;public AdUnit(Long planId, String unitName,Integer positionType, Long budget) {this.planId = planId;this.unitName = unitName;this.unitStatus = CommonStatus.VALID.getStatus();this.positionType = positionType;this.budget = budget;this.createTime = new Date();this.updateTime = this.createTime;}
}
由于推广单元包含三个限制,于是还需要建立三个限制表对应的实体类:
关联词限制:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_keyword")
public class AdUnitKeyword {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "keyword", nullable = false)private String keyword;public AdUnitKeyword(Long unitId, String keyword) {this.unitId = unitId;this.keyword = keyword;}
}
地域限制:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_it")
public class AdUnitIt {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "it_tag", nullable = false)private String itTag;public AdUnitIt(Long unitId, String itTag) {this.unitId = unitId;this.itTag = itTag;}
}
兴趣限制:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_unit_district")
public class AdUnitDistrict {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;@Basic@Column(name = "province", nullable = false)private String province;@Basic@Column(name = "city", nullable = false)private String city;public AdUnitDistrict(Long unitId, String province, String city) {this.unitId = unitId;this.province = province;this.city = city;}
}
3.4 实体类4——创意表:
建立实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ad_creative")
public class Creative {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "name", nullable = false)private String name;@Basic@Column(name = "type", nullable = false)private Integer type;/** 物料的类型, 比如图片可以是 bmp, jpg等等 */@Basic@Column(name = "material_type", nullable = false)private Integer materialType;@Basic@Column(name = "height", nullable = false)private Integer height;@Basic@Column(name = "width", nullable = false)private Integer width;/** 物料大小 */@Basic@Column(name = "size", nullable = false)private Long size;/** 持续时长, 只有视频不为0 */@Basic@Column(name = "duration", nullable = false)private Integer duration;/** 审核状态 */@Basic@Column(name = "audit_status", nullable = false)private Integer auditStatus;@Basic@Column(name = "user_id", nullable = false)private Long userId;@Basic@Column(name = "url", nullable = false)private String url;@Basic@Column(name = "create_time", nullable = false)private Date createTime;@Basic@Column(name = "updateTime", nullable = false)private Date updateTime;
}
创意与推广单元的关联:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "creative_unit")
public class CreativeUnit {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Basic@Column(name = "creative_id", nullable = false)private Long creativeId;@Basic@Column(name = "unit_id", nullable = false)private Long unitId;public CreativeUnit(Long creativeId, Long unitId) {this.creativeId = creativeId;this.unitId = unitId;}
}
考虑到有属性 creativeId 和 materialType,需要建立两个枚举类。
@Getter
public enum CreativeType {IMAGE(1, "图片"),VIDEO(2, "视频"),TEXT(3, "文本");private int type;private String desc;CreativeType(int type, String desc) {this.type = type;this.desc = desc;}
}
@Getter
public enum CreativeMetrialType {JPG(1, "jpg"),BMP(2, "bmp"),MP4(3, "mp4"),AVI(4, "avi"),TXT(5, "txt");private int type;private String desc;CreativeMetrialType(int type, String desc) {this.type = type;this.desc = desc;}
}
第四章 广告投放系统——数据库设计与实体类相关推荐
- cs结构航空订票系统java_VC++航空订票系统数据库设计-课程设计
VC++航空订票系统数据库设计 目录 一 绪论 1 二 需求分析 1 三 概要设计 2 四 详细设计 4 五 调试分析 19 六 测试结果 20 七 用户使用说明 29 小结 29 参考文献 30 ...
- 揭秘!闲鱼拉新投放系统如何设计
背景 闲鱼目前已经是国内最大的闲置物品交易平台.随着闲鱼体量的增长和用户规模不断扩大,闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片,每天都可能被数以千万计的人看到. 为了更好地 ...
- 电子商务系统数据库设计(一)
数据库基本操作 最近学数据库数据库学得飞起,学数据库当然少不了学sql,老师讲得很多很系统,但是我相信很多初学者不可能在短短40分钟之内把所有老师将的课程都吸收,个人认为,数据库的精髓在于多实践,多练 ...
- 我要翻译《Think Python》- 006 第四章 学习案例:接口设计
本文翻自:Allen B. Downey --<Think Python> 原文链接:http://www.greenteapress.com/thinkpython/html/think ...
- Blog博客系统数据库设计
2019独角兽企业重金招聘Python工程师标准>>> 项目--Blog博客系统数据库设计:http://blog.163.com/sean_zwx/blog/static/1690 ...
- 19年8月 字母哥 第四章 常用web开发数据库框架 不要用公司网络加载不出来 用热点!!!
第四章 常用web开发数据库框架 4.1.整合Spring JDBC操作数据 4.2 Spring JDBC多数据源的实现 4.3.Spring JDBC JTA实现分布式事务 4.4.ORM主流框架 ...
- 简易投票系统数据库设计
介绍 简易版的投票系统数据库设计. 发现设计有误请在评论区指出,谢谢! 一.截图 项目表 选项表 投票表 二.代码 票表 CREATE TABLE `as_ticket` (`id` varchar( ...
- 点餐系统mysql设计,外卖点餐系统数据库设计.doc
外卖点餐系统数据库设计.doc 外卖点餐系统数据库设计 需求分析: 现要开发外卖点餐系统.经过可行性分析和初步的需求调查,确定了系统的功能边界,该系统应能完成下面的功能: 订餐管理. (2)菜单管理. ...
- KTV点歌系统数据库设计文档
KTV点歌系统数据库设计文档 前台e-r图 后台 E-R 3.数据库字典 SwanInfo(歌星表) 中文名 英文名 数据类型 大小 约束 备注 歌星编号 SwanID varchar 20 主键, ...
- 服装系统mysql设计_服装销售系统数据库设计.ppt
* * * 数据库应用技术 山东外贸职业学院 服装销售系统数据库设计 项目描述 开发一套服装销售管理软件,对服装销售进行信息化管理. 包括:采购订货.退货.前台零售.批发业务.销售管理.会员管理.库存 ...
最新文章
- 使用xshell SSH远程连接 linux
- mysql 4G内存配置表
- mysql常用表名大全_MySQL常用命令大全
- 阿里云成为首个通过《面向公有云模式的政务云服务》测评的厂商
- vue开发手机页面闪烁_Vue页面加载闪烁问题的解决方法_婳祎_前端开发者
- mysql有没有类似merge_有关于Mysql的MERGE表类型
- thinkphp 框架两种模式 两种模式:开发调试模式、线上生产模式
- 【理财】【学校财务信息管理系统】一卡通网络金融化
- TypeError: 'list' object is not callable
- LeetCode答案汇总(持续更新...)
- 莫烦python进化算法_使用遗传算法解决TSP问题(莫烦python 学习笔记)
- Wechart 饼图
- 怎么修改PDF文件中的文字?快来学这两种方法
- android 照片同步 icloud,如何将iCloud照片传输到Android手机
- latex设置times new roman新罗马字体
- 2017年Go语言入门教程-徐培成-专题视频课程
- 三星推出体积更小的1亿像素图像传感器产品线;66%中企没看到数字化投资促进收入增长 | 美通企业日报...
- 资产管理可视化系统-RFID固定资产管理追踪方案-RFID资产管理解决方案-新导智能
- 递归算法和文件队列算法----实现多级文件夹的遍历,删除和复制操作
- XSS平台 XSS挑战之旅 解题记录 writeup
热门文章
- c++病毒代码(附源码)
- 工行u盾显示316_工行U盾只显示金融@家怎么显密码
- Premiere Pro CC2018安装资料及安装教程
- mindoc快速搭建教程
- st语言 数组的常用方法_三菱ST语言教学(2)——数组的使用
- 5W1H/SWOT/SMART/PDCA/时间管理
- 秒杀系统 后端设计方案
- Linux 的文件与目录(软连接和硬连接)
- 计算机初级程序员哪里颁发的,初级程序员证书怎么考_初级程序员证书考什么_上学吧...
- 计算机常用的英语单词及缩写,常见计算机英语缩写及单词