当前位置:网站首页>第2章搭建CRM项目开发环境(数据库设计)
第2章搭建CRM项目开发环境(数据库设计)
2022-07-07 15:39:00 【做一道光】
2.1CRM数据库设计
2.1.1数据库设计原则
我们可以结合项目原型来考虑数据库设计,市场活动,用户,这些都是需要是持久化的,所以都需要设计成表。表和表之间通常还会有一定的关系。看每一个创建表单上都有哪些属性。
1、所有的表来自于需求:
名词,特别是业务相关的名词。理清名词之间的关系。
概念性的名词设计成表、说明性的名词设计成字段。
有些不明显的名词,需要抽象,如数据字典表和数据字典类型表
2、字段:
1>主键:表中有很多字段,如果其中有一组字段能够唯一标识一条记录,则可以把这一组字段设计成主键。一般来讲,都是一个字段做主键,而且是没有业务语义的字段做主键。当然,也有个别情况下使用业务相关的字段做主键。
主键的生成方式:决定主键字段设计成什么类型和主键字段的长度。
a、自增:采用数据库提供的主键生成机制。
Mysql:auto_increment
Oracle:sequence
由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生了较大影响。因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成机制。
b、assigned:外部程序员负责生成。
UUID,
hi/lo,
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。
c、共享主键:
d、联合主键:
2>、外键:外键用于表示表和表之间的关系。有的运行时不加外键,就是通过程序来保证数据的完整性。
3>、日期型数据的使用char型
1,crm的表结构:
tbl_user 用户表
tbl_dic_type 数据字典类型表
tbl_dic_value 数据字典值
tbl_activity 市场活动表
tbl_activity_remark 市场活动备注表
tbl_clue 线索表
tbl_clue_remark 线索备注表
tbl_clue_activity_relation 线索和市场活动的关联关系表
tbl_customer 客户表
tbl_customer_remark 客户备注表
tbl_contacts 联系人表
tbl_contacts_remark 联系人备注表
tbl_contacts_activity_relation 联系人和市场活动的关联关系表
tbl_tran 交易表
tbl_tran_remark 交易备注表
tbl_tran_history 交易历史表
tbl_task 任务表
1)主键字段:在数据库表中,如果有一组字段能够唯一确定一条记录,则可以把它们设计成表的主键字段。
推荐使用一个字段做主键,而且推荐使用没有业务含义的字段做主键,比如:id等。
主键字段的类型和长度由主键值的生成方式来决定:
主键值的生成方式:
1)自增:借助数据库自身主键生成机制
数值型 长度由数据量来决定
运行效率低
开发效率高
2)assighed:程序员手动生成主键值,唯一非空,算法.
hi/low:数值型 长度由数据量决定
UUID:字符串 长度是32位
3)共享主键:由另一张表的类型和长度决定
tbl_person tbl_card
id name id name
1001 zs 1001 card1
1002 ls
4)联合主键:由多个字段的类型和长度决定
2)外键字段:用来确定表和表之间的关系。
1)一对多:一张表(A)中的一条记录可以对应另一张表(B)中的多条记录;
另一张表(B)中的一条记录只能对应一张表(A)中的一条记录。
A(1)---------B(n)
父表 子表
tbl_student tbl_class
id name class_id id name
1001 zs 111 111 class1
1002 ls 111 222 class2
1003 ww 222
1004 zl
添加数据时,先添加父表记录,再添加子表记录;
删除数据时,先删除子表记录,再删除父表记录;
查询数据时,可能会进行关联查询:
//查询所有姓张的学生的id,name和所在班级name
select s.id,s.name,c.name as className
from tbl_student s
join tbl_class c on s.class_id=c.id//假如外键不可以为空
where s.name like 'z%'
内连接:查询所有符合条件的数据,并且要求结果在两张表中都有相对应的记录
左外连接:查询左侧表中所有符合条件的数据,即使在右侧表中没有相对应的记录
*如果外键不能为空,优先使用内连接;
如果外键可以为空,
--假如只需要查询那些在另一张表中有相对应的记录,使用内连接
--假如需要查询左侧表中所有符合条件的记录,使用左外连接.
2)一对一:一张表(A)中的一条记录只能对应另一张表(B)中的一条记录;
另一张表(B)中的一条记录也只能对应一张表(A)中的一条记录。
tbl_person tbl_card
id name id name
1001 zs 1001 card1
a)共享主键:(不推荐)
添加数据:先添加先产生的表,再后产生的表记录
删除数据:先删除后产生的表记录,再删除先产生的表记录
查询数据:无需进行连接查询
//查询zhangsan的驾照信息 1001
select *
from tbl_card
where id='1001'
b)唯一外键:
tbl_person tbl_card
id name id name person_id(唯一性约束)
1001 zs 111 card1 1001
1002 ls 222 card2 1002
1003 ww 333 card3 1003
*一对一就是一种特殊的一对多。
*操作跟一对多完全一样。
3)多对多:一张表(A)中的一条记录可以对应另一张表(B)中的多条记录;
另一张表(B)中的一条记录也可以对应一张表(A)中的多条记录。
tbl_student tbl_course
id name id name
1001 zs 111 java
1002 ls 222 mysql
tbl_student_course_relation
student_id course_id
1001 111
1001 222
1002 111
1002 222
添加数据时,先添加父表记录(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)记录;
删除数据时,先删除子表记录(tbl_student_course_relation),再删除父表记录(tbl_student,tbl_course)
查询数据时,可能会进行关联查询:
//查询所有姓张的学生的id,name,和所选课程的name
select s.id,s.name,c.name as courseName
from tbl_student s
join tbl_student_course_relation scr on s.id=scr.student_id
join tbl_course c on scr.course_id=c.id
where s.name like 'z%'
3)给关于日期和时间的字段:
都按照字符串处理:
char(10) yyyy-MM-dd
char(19) yyyy-MM-dd HH:mm:ss
2,创建crm的数据库实例:
把sql脚本导入数据库实例:
3,搭建开发环境:
1)创建项目:crm-project
设置JDK.
创建工程:crm
补全目录结构:
2)添加jar包
边栏推荐
猜你喜欢
随机推荐
从DevOps到MLOps:IT工具怎样向AI工具进化?
LeetCode 1049. Weight of the last stone II daily question
国内首创!Todesk将RTC技术融入远程桌面,画质更清晰操作更流畅
From Devops to mlops: how do it tools evolve to AI tools?
L1-027 出租(Lua)
redis主从、哨兵主备切换搭建一步一步图解实现
命令模式 - Unity
LeetCode 403. Frog crossing the river daily
centos7安装mysql笔记
大笨钟(Lua)
第二十四届中国科协湖南组委会调研课题组一行莅临麒麟信安调研考察
mysql实现两个字段合并成一个字段查询
SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
What is cloud computing?
MySQL implements the query of merging two fields into one field
【可信计算】第十二次课:TPM授权与会话
LeetCode 1774. The dessert cost closest to the target price is one question per day
本周小贴士#140:常量:安全习语
麒麟信安中标国网新一代调度项目!
Proxmox VE重装后,如何无损挂载原有的数据盘?