-
一对多,多对多 数据库关系设计
2018-05-03 10:49:16简单整理一下,一对多,多对多表如何设计整理一下思路: 数据库实体间有三种对应关系:一对一,一对多,多对多。 一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。 一对多关系...做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表。然而在实际开发过程中,一对多,多对多的表处处都是!简单整理一下,一对多,多对多表如何设计整理一下思路:
数据库实体间有三种对应关系:一对一,一对多,多对多。
一对一关系示例:
- 一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。
一对多关系示例:
- 一个学生只属于一个班,但是一个班级有多名学生。
多对多关系示例:
- 一个学生可以选择多门课,一门课也有多名学生。
1.一对多关系处理:
通过学生和班级问题了解一对多:
设计数据库表:只需在 学生表 中多添加一个班级号的ID;
注:在数据库中表中初学时,还是通过添加主外键约束,避免删除数据时造成数据混乱!
2.多对多关系处理:
通过学生选课了解多对多问题的处理:
在多对多中在一个表中添加一个字段就行不通了,所以处理多对多表问题时,就要考虑建立关系表了
例:
学生表:
课程表:
关系表:
注:所以对于多对多表,通过关系表就建立起了两张表的联系!多对多表时建立主外键后,要先删除约束表内容再删除主表内容
-
thinkPHP中1对1,多对1,多对多数据库操作的总结
2018-05-25 21:03:41thinkPHP5中的数据库的关系基本分为:一对一、多对一、多对多这三种一.引例1、一对一关系实例一个老师对应一个id,一个id对应一个老师 2、多对一关系实例 一个班级拥有多个学生,一个学生只能够属于某个班级 3、多对...thinkPHP5中的数据库的关系基本分为:一对一、多对一、多对多这三种
一.引例
1、一对一关系实例
- 一个老师对应一个id,一个id对应一个老师
2、多对一关系实例
- 一个班级拥有多个学生,一个学生只能够属于某个班级
3、多对多实例
- 一个学生可以选修多门课程,一个课程可以被多个学生选修
二.一对一
一对一的关系下,thinkPHP框架可以直接访问数据库中的数据,像下面一样
class TeacherController { public function index() { $Teacher = new Teacher; $teachers = $Teacher->select(); var_dump($teachers); } }
这样可以直接输出teacher的所有信息
三.多对一
多对一的关系
在thinkPHP5中
多个学生对应于一个班级,这种情况下的访问法则为:
2、在这个方法中,通过一个id字段来获取这个对象;3、返回这个对象。
4,用该对象访问各种数据以一个klass类为例子
public function Klass() { return $this->belongsTo('Klass'); }
四.多对多
多对多的访问比较复杂,需要通过中间表来完成,像这样
通过访问中间表来取得班级对应的课程
在thinkPHP5中可以自动对中间表进行操作,十分方便
但是thinkPHP中同样存在着bug:
BUG1:
在Course中关联Klass,如果不加任何设置(直接将代码写为:return $this->belongsToMany(‘Klass’);),thinkphp 会尝试找course_klass这张表;而在Klass中关联Course,那么 thinkphp 则会尝试找klass_course这张表。显然,中间表只能有一个名字。这就使得我们在使用多对多关联时,还需要设置中间表的名字。BUG2:
当我们传入表名时,thinkphp 没有自动为我们加入表前缀。这使得我们需要手动的进行配置,但显然我更希望默认是自动加入表前缀的。 -
Flask 数据库 一对多 多对多
2020-08-12 14:08:20Flask 数据库 一对多 多对多 app.py import os from flask import Flask # 引入表格模块 from flask_sqlalchemy import SQLAlchemy #导入pymysql import pymysql #用pymysql 代替 MySqldb pymysql.install_as_...Flask 数据库 一对多 多对多
app.pyimport os from flask import Flask # 引入表格模块 from flask_sqlalchemy import SQLAlchemy #导入pymysql import pymysql #用pymysql 代替 MySqldb pymysql.install_as_MySQLdb() app=Flask(__name__) # 获取文件路径 BASE_DIR=os.path.abspath(os.path.dirname(__file__)) # 配置数据库sqlite app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///'+os.path.join(BASE_DIR,'sqlite3.db') #配置数据库mysql # app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@127.0.0.1:3306/test' # 创建一个父类让python中的类去继承 就可映射成表格 db=SQLAlchemy(app)
main.py
#控制文件 from app import app from models import db from views import * if __name__ == '__main__': #删除所有表 db.drop_all() #创建所有表 db.create_all() app.run(debug=True)
models.py
#存放类模块 from app import db #抽象父类 class Base(db.Model): __abstract__=True id = db.Column(db.INT, primary_key=True, autoincrement=True) #添加员工 def save(self): # 保存对象 db.session.add(self) # 提交事务 db.session.commit() def updte(self): db.session.commit() def delete(self): # 删除对象 db.session.delete(self) # 提交事务 db.session.commit() #职位 class Position(Base): __tablename__="position" name=db.Column(db.String(32)) #职位名称 level=db.Column(db.Integer) #级别 #关系属性 #为了查询方便,flask提供了关系属性,为了方便查询,但是不会在数据库中生成相应的字段 persons=db.relationship("Person",backref='position') #当知道职位查询所有的员工时,通过 职位对象.persons就可以获得所有的员工 # 当员工查询对应的职位的时候,通过 员工对象.position就可获得对应的职位 # 职员 class Person(Base): """雇员表""" __tablename__ = "person" username = db.Column(db.VARCHAR(100)) password = db.Column(db.VARCHAR(64)) nickname = db.Column(db.String(64), nullable=True) # 昵称 gender = db.Column(db.String(8), nullable=True) # 性别 age = db.Column(db.Integer, nullable=True) # 年龄 workid = db.Column(db.String(32), nullable=True) # 工号 phone = db.Column(db.String(64), nullable=True) # 电话 email = db.Column(db.String(64), nullable=True) # 邮箱 photo = db.Column(db.String(64), nullable=True) # 照片 address = db.Column(db.Text, nullable=True) # 地址 score = db.Column(db.Float, nullable=True) # 绩效 #关系属性 #职位和员工一对多关系 position_id=db.Column(db.Integer,db.ForeignKey("position.id")) #职位与权限中间表 permission_position=db.Table( 'permission_position', db.Column("id",db.Integer,primary_key=True,autoincrement=True), db.Column("position_id",db.Integer,db.ForeignKey("position.id")), #关联position db.Column("permission_id",db.Integer,db.ForeignKey("permission.id")), #关联permission ) #权限表 class Permission(Base): __tablename__="permission" name=db.Column(db.String(32)) #权限名称 desc=db.Column(db.String(128)) #权限描述 #关系属性 positions=db.relationship( 'Position',# 和模型类进行关联 backref='permissions', secondary=permission_position )
from sqlalchemy import func, or_,and_,not_ from app import app from models import * @app.route('/') def index(): return "index" # 查询所有员工 @app.route('/SelectAll') def SelectAll(): # 得到Person表中所有数据(select * from person) res=Person.query.all() #得到的是一个列表对象 for person in res: #得到person对象 for key,value in person.__dict__.items(): if value!=None: print(f"{key}:{value}",end=" ") print() return "SelectAll" # 根据id来查找 @app.route('/Select_By_Id/<int:id>') def Select_By_Id(id): Person_list=Person.query.filter(Person.id==id) #得到的是一个sql语句 res=Person_list.all() print(res) #当id=1时 [<Person 1>] 当没有找到时 [] return "Select_By_Id" #条件语句 @app.route('/Filter') def Filter(): # like 模糊查询 ret=Person.query.filter(Person.username.like("z%")).all() # limit()限制返回条数 # ret2=Person.query.limit(2).all() # 偏移1条记录,返回2条记录 ret2=Person.query.limit(2).offset(1).all() # order_by() 排序 Person.id.desc() 降序 asc():升序 ret3=Person.query.order_by(Person.id.desc()).all() # 分组 group_by query(Person.gender,func.count(Person.id))=>select gender,count(id) from person ret4=db.session.query(Person.gender,func.count(Person.id)).group_by(Person.gender).all() # 逻辑判断 and_,or_,not_ ret5=Person.query.filter(or_(Person.gender=="男",Person.age>18)).all() print(ret) #[<Person 2>] print(ret2) #[<Person 2>, <Person 3>] print(ret3) #[<Person 4>, <Person 3>, <Person 2>, <Person 1>] print(ret4) #[('女', 1), ('男', 3)] print(ret5) #[<Person 1>, <Person 2>, <Person 3>, <Person 4>] return "Filter" # 添加员工 @app.route('/add_person') def add_person(): # 创建员工对象 person = Person() person.name="zhangsan" person.age=18 person.save() return 'add person' # 用户修改 @app.route('/Person_Update') def Person_Update(): person_obj=Person.query.get(1) person_obj.age=30 # 提交事务 db.session.commit() return "update" @app.route('/Person_Del') def Person_Del(): person=Person.query.get(2) person.delete() return "Person_Del" #一对多添加 @app.route('/one_add') def one_add(): #添加员工 person = Person(username="zhangsan",age=18,nickname="张三") person2 = Person(username="lisi",age=28,nickname="李四") person.save() person2.save() #添加职位 pos1=Position(name="职员",level=1) pos2=Position(name="产品经理",level=2) pos1.save() pos2.save() # 设置关系 # 张三的职位是职员 李四的职位是产品经理 # 正向设置关系 pos1=Position.query.filter(Position.level==1).first() #获取职员对象 person=Person.query.filter(Person.nickname=="张三").first() #获取张三对象 pos1.persons=[person] pos1.save() # 反向设置关系 pos2 = Position.query.filter(Position.level == 2).first() # 获取产品经理 person2 = Person.query.filter(Person.nickname == "李四").first() # 获取李四 person2.position=pos2 person2.save() return "one_add" #多对多添加 @app.route('/two_add') def two_add(): #增加权限 p_list=["考勤权限","新闻权限","人事权限","权限管理"] for p in p_list: permission_obj=Permission(name=p,desc=p+'crud') permission_obj.save() # 增加职位 pos_obj=Position(name="开发工程师",level=3) pos_obj2=Position(name="高级开发工程师",level=4) pos_obj.save() pos_obj2.save() # 设置关系 #正向设置关系 # 给考勤权限设置 开发工程师 和高级工程师职位 per_obj=Permission.query.get(1) per_obj.positions=[pos_obj,pos_obj2] per_obj.save() return "two_add"
-
数据库一对一、一对多、多对多关系
2018-01-10 15:54:10数据库一对一、一对多、多对多关系 本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧 一、首先给出三种关系的实例 1、一对一关系实例 ...数据库一对一、一对多、多对多关系本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧一、首先给出三种关系的实例1、一对一关系实例* 一个人对应一张身份证,一张身份证对应一个人2、一对多关系实例* 一个班级拥有多个学生,一个学生只能够属于某个班级3、多对多实例* 一个学生可以选修多门课程,一个课程可以被多个学生选修二、一对一关系一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面三、一对多关系- 班级是1端,学生是多端,结合面向对象的思想,1端是父亲,多端是儿子,所以多端具有1端的属性,也就是说多端里面应该放置1端的主键,那么学生表里面应该放置班级表里面的主键
四、多对多关系
对于多对多关系,需要转换成1对多关系,那么就需要一张中间表来转换,这张中间表里面需要存放学生表里面的主键和课程表里面的主键,此时学生与中间表示1对多关系,课程与中间表是1对多关系,学生与课程是多对多关系
四、总结
总而言之,最重要的关系就是1对多关系,根据面向对象思想在建表的时候将1端主键置于多端即可。
-
数据库一对多、 多对多案例
2018-08-22 21:21:34数据库一对多案例(一个旅游类别对应多个旅游路线) 一个旅游的类别对应多个旅游线路。类别与旅游线路表是属于1对多的关系: #创建一个旅游类别表 CREATE TABLE tab_category( #旅游线路分类主键 cid INT ... -
数据库建模多表一对多和多对一、一对一、多对多
2018-06-13 18:29:30----------------------------------------数据库建模多表一对多和多对一、一对一、多对多-------------------------------------------------------一对多和多对一我们再创建一张订单表,用户表和订单表之间的关系... -
数据库表设计(一对多,多对多)
2018-09-26 09:21:05三、数据库怎么设计多对多的数据表 回到顶部 一、总结 1、项目中小组和主题之间是多对多的 2、可以将常用信息和不常用信息分成两个表来优化数据库 2、一对多的话:在多的里面建立一的字段,比如母亲(一... -
Flask 数据库多对多关系
2016-05-06 17:05:58数据库使用关系建立记录之间的联系。其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起。实现这种关系时,要在“多”这一侧加入一个...唯一不能从一对多关系中简单演化出来的类型是多对多 -
数据库多对多关系
2018-02-27 23:59:06一般我们用三张表来描述多对多的关系。例子:多个分类,每个分类有多个商品。另外每个商品在不同的分类。以下例子不太恰当,自己瞎举得,知道意思就好类:水果 A类 B类商品:A果,A菜,B果,B菜,我们创建数据表商品... -
数据库一对一 一对多 多对多关系
2020-06-04 20:09:34‘实体’和‘公理’具有多对多关系,即一个实体可以对应多个公理,一个公理也可以包含多个实体。 多对多关系需要一张纽带表来实现。 // 实体表格 create table if not exists `entity_management` ( `id` int ... -
数据库一对一、一对多、多对多设计
2016-11-18 10:21:03做一个项目,必然是少不了数据库... 数据库实体间有三种对应关系:一对一,一对多,多对多。 一对一关系示例: 一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。 一对多关系示例: -
数据库多对多关系建表
2019-08-26 00:45:59对于多对多的关系,建表的方式是有两种的,最常见的做法就是建立一张中间关系表b,关联另外两张表a和c的主键,不要其他多余信息,这种做法通常的情况就是a表和c表中的数据不能有重复的,所以我们只能建立单独的关联... -
Django数据库多对多数据关系
2017-10-10 19:39:35本文主要描述Django数据中一对一的数据关系,创建app等配置不再赘述。 Django操作数据库,使用ORM ORM:关系映射对象,把...多对多关系 举例:一个出版社发表多个文章,一篇文章也可以对多个出版社发表 ManyToManyF -
ORACLE数据库设计 多对多关系
2017-04-21 11:44:20关于数据库两张表多对多的关系设计,之前以为多对多关系,只要两张表存在各自对方表的主键就行。而这种理解是错误的,总结如下。 数据库多对多表设计,假设使用主外键关系设计多对多表关系,会造成: 1、对一张表... -
数据库实体间一对多(多对一)、多对多关系处理
2018-03-20 10:24:10原文:http://blog.csdn.net/lm709409753/article/details/48440401数据库实体间有三种对应关系:一对一,一对多,多对多。一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。一对多... -
数据库建表-- 一对多/多对一/一对一/多对多 关系
2018-05-03 13:54:27转自:https://blog.csdn.net/zhongshan_c/article/details/8210196数据库建表-- 一对多/多对一/一对一/多对多 关系 关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从... -
数据库一对一、一对多、多对多,表设计
2019-01-11 11:13:21一对一关系实例 ***********一个学生对应唯一的身份证号码。...多对多关系实例 ***********一位学生可以选多门课程,一门课程也对应多位学生。 一对多关系处理: 设计数据库表时,只需在 学... -
ORACLE 数据库设计 多对多关系
2013-10-29 16:42:52关于数据库两张表多对多的关系设计,之前以为多对多关系,只要两张表存在各自对方表的主键就行。殊不知这种理解是错误的,今天借此时间总结一下。 数据库多对多表设计,假设使用主外键关系设计多对多表关系,会造成... -
数据库外键:一对多/多对多关系
2019-01-18 17:21:31数据库事务四大特性ACID: 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) ...一对多: # 用户表 一 class User(db.Model): __tablename__ = "t_user" id = db.Column(db.Integer, pri... -
数据库:一对一,一对多,多对多
2018-08-16 10:08:11其实不然,如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。 条件:建立单独的表就行了, 优点 1. 便于管理、可提高一定的查询速度 2. 减轻 CPU... -
mysql数据库设计-多对多
2015-01-12 21:14:56数据库设计多对多关系的几种形态 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,... -
数据库表多对多的设计
2016-03-15 17:59:39现在有A、B、C三张表,A和B是一对多的关系,B和C是一对一的关系,C和B是一对多的关系,A和C是多对多的关系。问题:是否设计第四张表专门存放A、B、C的关系,还是把关系维护在B表中? 原则: 首先在数据库中不建议... -
数据库设计一对多、多对多关系
2017-02-20 23:13:01关联映射:一对多关系 简单来说就像球队和...多对多:一门课程有若干个学生选修,而一个学生可以同时选修多门课程,则课程和学生之间具有多对多的关系。 数据表间多对多的关系如图: 注:图片转载至http:// -
数据库怎么设计多对多的数据表
2018-05-11 00:50:00数据库怎么设计多对多的数据表 一、总结 1、项目中小组和主题之间是多对多的 2、可以将常用信息和不常用信息分成两个表来优化数据库 2、一对多的话:在多的里面建立一的字段,比如母亲(一)和孩子(多),在... -
数据库 一对多。多对多关系处理
2016-04-21 13:59:04一个公司有多台车辆。设备安装在车辆上。需要填写绑定信息。sim卡安装在设备上 是否开通。 目前是。设备表。sim表。安装表关键。车辆与设备。车辆表。公司表 查询时需要查询某个公司的某台车辆是否绑定某台设备。... -
【转】数据库一对一、一对多、多对多关系
2018-11-01 10:39:30本来数据库一对一、一对多、多对多关系并不复杂,但是最近在理解的时候感觉又感觉多了写新意,所以现在在来总结一下吧 一、首先给出三种关系的实例 1、一对一关系实例 * 一个人对应一张身份证,一张身份证对应一... -
数据库中多对多的关系设计
2016-01-27 23:16:56数据库设计多对多关系的几种形态 前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,... -
jdbc只连接一次数据库,实现多次对数据库操作
2017-06-27 14:58:06现在我有一个业务是要用jdbc连接3个数据库,没个数据库都有多次查询的逻辑,现在我想把连接数据库抽出来,让他每个数据库只连接一次,但可以对数据库进行多次操作,不要说连接池,我这没法加jar,求大神指点,最好有... -
请教数据库如何建立多对多关系
2016-05-31 13:48:31请教数据库如何建立多对多关系(最好以mysql为例) 请问数据库怎么建立多对多关系(最好以mysql为例) 我建立了两张表: create table custom( #顾客表 id int(10) primary key auto_...
-
基于SSH的任务调度系统的设计与实现.rar
-
智能停车场云平台(附vue+SpringBoot前后端项目源码)
-
opencv3.3.1要的文件.rar
-
【硬核】一线Python程序员实战经验分享(1)
-
a2a-ip-trust-ip-configuration:用于访问IP音频信任组件的OpenShift构建和部署配置-源码
-
Java NIO的学习总结
-
安装使用 Docker Compose
-
MySQL 多实例安装 及配置主从复制实验环境
-
第四章 C语言 PTA数组——作业-答案.html
-
Web基础知识学习之加密(对称加密与非对称加密)
-
Samba 服务配置与管理
-
MySQL 备份与恢复详解(高低版本 迁移;不同字符集 相互转换;表
-
大数据分析关键技术.pptx
-
Python笔记-----迭代器、生成器
-
FACEBOOK 时间序列预测算法 PROPHET 的研究
-
中国电信云网融合2030技术白皮书.pdf
-
华为1+X认证——网络系统建设与运维(初级)
-
安徽大学615马克思主义基本原理考研真题汇编[
-
二维码实例.zip下载
-
2021年 系统架构设计师 系列课