转自:

https://blog.csdn.net/zhongshan_c/article/details/8210196

数据库建表-- 一对多/多对一/一对一/多对多 关系

关联映射:一对多/多对一存在最普遍的映射关系,简单来讲就如球员与球队的关系;一对多:从球队角度来说一个球队拥有多个球员 即为一对多多对一:从球员角度来说多个球员属于一个球队 即为多对一数据表间一对多关系如下图:

注:一对多/多对一关系简记:“多”的要记住“一”的主键,即每个球员表都要通过外键来记住球队表。

关联映射:一对一关系就如球队与球队所在地址之间的关系,一支球队仅有一个地址,而一个地址区也仅有一支球队。数据表间一对一关系的表现有两种,一种是外键关联,一种是主键关联。图示如下:
一对一外键关联:

一对一主键关联:要求两个表的主键必须完全一致,通过两个表的主键建立关联关系

关联映射:多对多

多对多关系也很常见,例如学生与选修课之间的关系,一个学生可以选择多门选修课,而每个选修课又可以被多名学生选择。 数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多。

数据表间多对多关系如下图:

----------------------------------------------------------------------------------------------------------

前言:多对多关系至少需要3个表,我们把一个表叫做主表,一个叫做关系表,另外一个叫做字典表或者副表(字典表是纪录比较少,而且基本稳定的,例如:版块名称;副表是内容比较多,内容变化的,例如)。 
按照数据库的增删查改操作,多对多关系的查找都可以用inner join或者

select * from 主表 where id in (select 主表id from 关系表)

1,角色任命型

特点:关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键,有一个表是字典类型的表。 
界面特点:显示主表,用checkbox或多选select设置多选关系。 
例如:任命版主(用户表-关系表-版块名称表),角色权限控制等,用户是5个版块版主,只要关系表5行纪录就可以确立,关系表的两个外键具有联合主键性质。 
增加关系:如果没有组合纪录,insert之。 
删除关系:如果有组合纪录,删除之。

2,集合分组型

特点:同角色任命型类似,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。区别是主副表都不是字典表,可能都很大不固定。 
界面特点:显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 
例如:歌曲专集(专集表-关系表-歌曲表)。手机分组(分组表-关系表-手机表)。用户圈子(圈子表-关系表-用户表)。文章标签(文章表-关系表-标签表) 
增加关系:同版主任命型。 
删除关系:同版主任命型。

3,明细帐型

特点:关系表可以有重复纪录,关系表一般有时间字段,有主键,可能还有文字型的字段用来说明每次发生关系的原因(消费)。 
界面特点:显示关系表,用radio或下拉设置单选关系。 
例如:现金消费明细帐或订单(用户表-订单表-消费原因表),用户可能多次在同一事情上重复消费。积分变化纪录也属于这类。 
增加关系:不管有没有组合纪录,insert之,纪录时间。 
删除关系:根据关系表PK删除。

4,评论回复型

特点:同明细帐型关系表一般有时间字段,有主键,区别是重点在文字型的字段用来说明每次发生关系的内容(评论回复)。 
界面特点:回复文本框。 
例如:论坛回复(用户表-回复表-帖子表),用户可能多次在不同帖子上评论回复费。 
增加关系:不管有没有组合纪录,insert之,纪录时间和文字。 
删除关系:根据关系表(回复表)PK删除。

5,站内短信型

特点:主副表是同一个,关系表一般有时间字段,有主键,重点在关系表文字型的字段用来说明每次发生关系的内容(消息)或者其他标记位来表示文字已读状态时间等。 
界面特点:回复文本框。 
例如:站内短信(用户表-短信表-用户表),用户可能给用户群发或者单发,有标记位来表示文字已读状态时间等。 
增加关系:不管有没有组合纪录,insert之,纪录时间和文字。 
删除关系:根据关系表(回复表)PK删除。

6,用户好友型

特点:主副表是同一个,同集合分组型,关系表两外键组合无重复纪录,关系表一般不需要时间字段和主键。 
界面特点:同集合分组型,显示主表,用搜索代替简单的checkbox或多选select,或者一条一条的添加。 
例如:下载站点的文件,(文件表-关系表-文件表)可以被软件工具打开,软件工具本身也是一种文件,可以被下载。用户的好友,也是用户(用户表-好友关系表-用户表) 
增加关系:同版主任命型。 
删除关系:同版主任命型。

7,未知属性型

特点:在设计初期,主表的某些字段类型和名称是不确定的时候,关系表实际上是主表的可扩展字段, 
一个[主表](ID), 
一个[属性名称表](属性ID.属性名称), 
一个[属性值表],包括3个字段: 
      属性值(属性Value varchar(500)) 
      主表ID 
      属性ID

这样可以作到最小冗余度。 
(和常见的多对多关系不同的是:值统一用varchar来存储,因为这类型的值一般不会用来计算)。

比如:

军队的数据库设计中有种物资叫做“战缴物资”,就是打仗的时候缴获的,军队自己都不知道这些物资有什么属性。

比如缴获的化学品有化学名,通用名,是否有辐射,计量单位,包装规格,数量等等,或者不是化学品是其他任何未知的东西。 
这样东西就可以

某奇怪东西.属性集合["某某奇怪属性名"]="某某奇怪值";    
某变态东西.属性集合["某某变态属性名"]="某某变态值";

这样存储。

再比如:

手机型号有几千种,除了共同属性外还有不同属性有几百个,属性名和值类型都不一样,有的手机有这属性,有的没有。 
对于这样的“多态”,我们就采用上面的设计结构。 
其效果相当于:

某奇怪手机.属性集合["某某奇怪属性名"]="某某奇怪值"; 
某变态手机.属性集合["某某变态属性名"]="某某变态值";

界面特点:设置主表一行纪录的属性时候,要列出所有可能的属性名称,每个对应一个文本框。

数据库建表-- 一对多/多对一/一对一/多对多 关系相关推荐

  1. 数据库建表时一定要设置外键约束关系吗?

    数据库建表时一定要设置外键约束关系吗? 我们都知道每张数据表都有一个能够确定每行数据唯一性的字段,也就是主键.而在关系数据库中,常常有两表存在一定关系的情况.即一张表的主键跟另一张的外键存在对应关系, ...

  2. mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?

    如果被引用的表需要做分库分表,那么无法建立外键约束. 使用外键会降低数据库性能,这个说法并不细致.需要详细分析. 建立外键,那么一般引用字段上需要建立索引.如果不建立索引,被引用的表上删除数据,会全表 ...

  3. 数据库建表需要外键约束?

    数据库建表需要外键约束吗? 数据库建表时一定要设置外键约束关系吗?

  4. 数据库建表原则,SQL数据库建表前期优化,SQL数据库操作优化,数据库命名规范...

    2019独角兽企业重金招聘Python工程师标准>>> 关键字: 数据库建表原则 ·1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关 ...

  5. 数据库建表的 15 个最佳实践方式

    前言 对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节. 系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等. 后端开发的日常工作,需要不断的 ...

  6. 聊聊数据库建表的15个小技巧

    前言 对于后端开发同学来说,访问数据库,是代码中必不可少的一个环节. 系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等. 后端开发的日常工作,需要不断的 ...

  7. PowerDesigner生成数据库建表sql脚本

    PowerDesigner生成数据库建表sql脚本 一.生成sql server 2000或oracle建表sql脚本 1.新建一个物理模型,通过database菜单下的change current ...

  8. oracle建表代码,Oracle 建表(一对多)代码及相关约束示例

    建表(一对多)代码及相关约束 create table t_class( c_id number(3) primary key, c_name varchar2(20) not null ); cre ...

  9. java 建表 框架_【Java框架型项目从入门到装逼】第九节 - 数据库建表和CRUD操作...

    1.新建学生表 这节课我们来把和数据库以及jdbc相关的内容完成,首先,进行数据库建表.数据库呢,我们采用MySQL数据库,我们可以通过navcat之类的管理工具来轻松建表. 首先,我们得建一个数据库 ...

最新文章

  1. 一款SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全
  2. C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历
  3. 第二十五期:5G预约用户超千万!是“虚火”还是“真旺”?
  4. 【LeetCode笔记】226. 翻转二叉树(Java、递归)
  5. win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
  6. 产品经理必看:终于有人把数据指标讲明白了
  7. 计算机单招语文试题,2019年高职单招语文模拟试题
  8. opencv-api getRotationMatrix2D
  9. SAP License:SAP RKE_HZSTMP标准时间转EXCEL日期方法
  10. mysql复合语句声明开始于_mysql8 参考手册--BEGIN ... END复合语句
  11. 判断Windows服务是否启动
  12. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_1_缓冲流的原理...
  13. 在Java中使用Rserve调用R
  14. internal/child_process.js:313 Error:spawn EACCES
  15. esp8266教程:esp8266使用mqtt连接百度智能云
  16. 【TA-霜狼_may-《百人计划》】图形3.3 曲面细分与几何着色器 大规模草渲染
  17. 简述网页部分知识点:空链接、锚链接、网页图标等
  18. 系列篇|结构光三维重建基本原理
  19. java电商项目搭建-------分布式文件存储系统(fastDFS)
  20. vim 使用set paste 解决多行复制粘贴乱序问题

热门文章

  1. 如何使用Redis缓存 ?
  2. Python中文转数字
  3. 最优化理论·非线性最小二乘
  4. Java基础:方法和类详解
  5. 浅谈![CDATA[ ]]
  6. C语言指针详解(新手入门推荐)
  7. 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID
  8. YOLOv5 + Tesseract-OCR 实现车牌号文本识别
  9. NV12 和 NV21的区别
  10. C++ getchar()函数