表关系管理

在上一篇序列号管理中,产品和销售订单都是孤立的单表,本文通过crudapi中表关系(relation)管理将多个表连接起来,形成一个整体。

概要

关系类型

表与表之间的关系(relation),分成三种。

一对一(one-to-one):一种对象与另一种对象是一一对应关系,比如一个学生只能在一个班级。

一对多(one-to-many):一种对象可以属于另一种对象的多个实例,比如一张唱片包含多首歌。

多对多(many-to-many):两种对象彼此都是"一对多"关系,比如一张唱片包含多首歌,同时一首歌可以属于多张唱片。

订单

完整订单主要有4个表组成:销售订单主表(salesOrder),订单行(salesOrderLine),产品(product),客户(customer),他们之间的关系如下:

订单和客户:多对一



首先创建客户表,主要有编号ID、手机、邮箱、会员卡号等字段



销售订单表添加客户编号字段,用于建立表关系



建立多对一关系,销售订单salesOrder表的customerId客户编号字段,指向客户customer的编号id字段,关系的英文名称customer用于查询关联对象的时候,设置导航属性名称为customer, 在查询订单的时候,通过customerId查询出customer对象,salesOrder对象格式如下:

{
"id": 4,
"name": "足球 跑鞋订单",
"createdDate": 1613182392000,
"orderNo": "SO20210213101311719",
"productPrice": 380,
"expressFee": 10,
"totalPrice": 390,
"customerId": 2,
"customer": {
"id": 2,
"name": "关羽"
}
}

订单和订单行:一对多



首先创建订单行表,主要有编号ID、订单编号、产品编号、单价、数量、小计等字段。



建立一对多关系,销售订单salesOrder表的编号id字段,指向订单行salesOrderLine的订单编号salesOrderId字段,关系的英文名称salesOrderLines用于查询关联对象的时候,设置导航属性名称为salesOrderLines, 内容为数组。

订单行和产品:多对一



产品表保持之前不变,主要有编号ID、订单编号、产品编号、单价、数量、小计等字段。



建立多对一关系,订单行salesOrderLine表的productId产品编号字段,指向产品product的编号id字段,关系的英文名称product用于查询关联对象的时候,设置导航属性名称为product, 在查询订单行的时候,通过productId查询出product对象。

完整关系图



订单salesOrder和产品product是多对多关系,通过订单行salesOrderLine这个中间表建立连接,实际是由“一对多”和“多对一”两个关系合并而成,设置完全部关系后,salesOrder对象格式如下:

{
"id": 4,
"name": "足球 跑鞋订单",
"createdDate": 1613182392000,
"orderNo": "SO20210213101311719",
"productPrice": 380,
"expressFee": 10,
"totalPrice": 390,
"customerId": 2,
"customer": {
"id": 2,
"name": "关羽"
},
"salesOrderLines": [{
"id": 1,
"name": "2个足球",
"createdDate": 1613182392000,
"salesOrderId": 4,
"productId": 5,
"unitPrice": 58,
"quantity": 2,
"subTotal": 116,
"product": {
"id": 5,
"name": "足球"
}
}, {
"id": 2,
"name": "3双跑鞋",
"createdDate": 1613182392000,
"lastModifiedDate": 1613190617000,
"salesOrderId": 4,
"productId": 4,
"unitPrice": 88,
"quantity": 3,
"subTotal": 264,
"product": {
"id": 4,
"name": "跑鞋"
}
}]
}

验证

创建订单



ui创建订单,支持主子表级联合保存,客户和产品可以通过select控件选择。

查询订单详情

小结

本文介绍了订单中一对多,多对一关系,通过配置的方式实现了对象之间的关联,无需编程实现了主子表CRUD操作,后续详细介绍所有的关系类型。

附demo演示

本系统属于产品级的零代码平台,不同于自动代码生成器,不需要生成Controller、Service、Repository、Entity等业务代码,程序运行起来就可以使用,真正0代码,可以覆盖基本的和业务无关的CRUD RESTful API。

官网地址:https://crudapi.cn

测试地址:https://demo.crudapi.cn/crudapi/login

订单和产品的多对多表关系在crudapi系统零代码实现的更多相关文章

  1. Python之路第十三天,高级(7)-详述数据库一对多,多对多表关系的设计以及如何查询

    一对多表设计和查询方法 #!/usr/bin/env python3 # Author: Zhangxunan from sqlalchemy import create_engine from sq ...

  2. Django创建多对多表关系的三种方式

    方式一:全自动(不推荐) 优点:django orm会自动创建第三张表 缺点:只会创建两个表的关系字段,不会再额外添加字段,可扩展性差 class Book(models.Model): # ... ...

  3. EF5+MVC4系列(1) Podwerdesigner15.1设计数据库;PD中间表和EF实体模型设计器生成中间表的区别;EF5.0 表关系插入数据(一对多,多对多)

    在上一篇文章中, http://www.cnblogs.com/joeylee/p/3790980.html  我们用 PD15.1 来设计了数据库,并且生成 了sql数据库,现在我们用 vs2013 ...

  4. django-创建表的字段属性,表关系

    表的各种属性文档:null char ..., django与之对应的文档 https://docs.djangoproject.com/en/1.11/ref/models/fields/   英文 ...

  5. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)

    在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...

  6. 在MySQL数据库建立多对多的数据表关系

    在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表 步骤1:创建三张数据表Stud ...

  7. 库增删该查,表增删该查,记录增删该查,表与表关系(多对多,多对一,一对一),mysql用户管理

    库增删该查 增加库 create database db1 create database db1 charset="gbk 查看库 show databases 查看所有库 show cr ...

  8. day 69 orm操作之表关系,多对多,多对一(wusir总结官网的API)

    对象  关系  模型 wusir博客地址orm官网API总结 django官网orm-API orm概要: ORM 跨表查询 class Book(models.Model): title = mod ...

  9. Hibernate表关系映射之多对多映射

    一.多对多的实现原理 在数据库中实现多对多的关系,必须使用连接表.也就是用一个独立的表来存入两个表的主键字段,通过遍历这张表来获取两表的关联关系. 而在我们的对象中,多对多是通过两者对象类中互相建立对 ...

随机推荐

  1. 牛客小白月赛17 A 小sun的假期

    传送门 题意: 第一行两个数n,m,代表总共有n天,m个安排.接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了.安排可能会重复. 小 sun 非常喜欢放假,尤其是那种连在一起 ...

  2. Codeforces #637 div2 B. Nastya and Door

    题意:给你一个数组a,定义:若a[i]>a[i]&&a[i]>a[i-1],则a[i]为峰值,求长度为k的区间内峰值最多能为多少,并输出这个区间的左端点(区间需要将峰的左边 ...

  3. ucosIII学习笔记——钩子函数

    一开始听见钩子函数感觉很莫名其妙,更不知道它有何作用,这是第一篇博客,也是学习ucosIII操作系统的一个开始吧. 在系统中有开发者自己创建的任务也有系统内部任务 ,UCOSIII中有五个系统任务,分 ...

  4. OpenStack服务默认端口号

    在某些部署中,例如已设置限制性防火墙的部署,您可能需要手动配置防火墙以允许OpenStack服务流量. 要手动配置防火墙,您必须允许通过每个OpenStack服务使用的端口的流量.下表列出了每个Ope ...

  5. Python-collections模块之defaultdict

    defaultdict defaultdict 是 dict 类型的子类,正如其名,初始化时,可以给key指定默认值,什么意思呢?直接看代码.如果是普通的dict对象,访问一个不存在的key时,会报错 ...

  6. WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS

    title: WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS date: 2020-03-20 10:43:00 categories: acm tags: [ ...

  7. 逆元 exgcd 费马小定理 中国剩余定理的理解和证明

    一.除法取模逆元 如果我们要通过一个前面取过模的式子递推出其他要取模的式子,而递推式里又存在除法 那么一个很尴尬的事情出现了,假如a[i-1]=100%31=7 a[i]=(a[i-1]/2)%31 ...

  8. Leetcode(869)-重新排序得到 2 的幂

    从正整数 N 开始,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零. 如果我们可以通过上述方式得到 2 的幂,返回 true:否则,返回 false. 示例 1: 输入:1 输出 ...

  9. C++ part7

    1.C++ 继承和组合 类的组合和继承一样,是复用的重要方式. 要优先使用组合而不是继承. 原因: 组合是黑箱复用,对局部类的内部细节不可见:继承是白箱复用,父类的内部细节可见,破坏封装性. 继承在编 ...

  10. 考研最路径dijkstra和floyd

    先来讲个段子:为什么 Dijkstra 不能提出 floyd 算法?因为他的名字是 ijk 而不是 kij. get不到点没有关系.我们今天的任务是看懂这个笑话. dijkstra 的效率是n^2.处 ...