`
kidiaoer
  • 浏览: 818713 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

数据库如何处理多对多的关系

阅读更多
数据库设计多对多关系的几种形态(7种)
Posted on 2009-06-09 23:37 peterzb 阅读(739) 评论(1) 编辑 收藏 所属分类: 数据库技术

数据库设计多对多关系的几种形态
前言:多对多关系至少需要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来存储,因为这类型的值一般不会用来计算)。

比如:

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

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

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

这样存储。

再比如:

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

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

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


实例:
用户表:
ID  Name
1   ABC
2   BCE
3   DEP
用户权限表
ID HERF
1   a.asp
2   b.asp
3   c.asp

映射表
用户ID   权限ID   映射表ID
1        1           1
1        2           2
1        3           3
2        2           4
2        3           5
3        1           6
这样用inner join把用户的ID = 映射表的用户ID , 权限表的ID = 映射表的权限ID,查询后你就有这样的结果:
用户Name     权限       用户ID       权限ID   映射表ID
ABC          a.asp         1           1         1
ABC          b.asp         1           2         2
ABC          c.asp         1           3         3
BCE          b.asp         2           2         4
BCE          c.asp         2           3         5
DEP          a.asp         3           1         6

这样用户就和权限形成了多对多的关系!
同理你还可以加上用户组表

用户组表
ID      Name
1       组1
2       组2

用户组映射表
用户ID   组ID   组映射表ID
1         1         1
2         1         2
3         1         3
2         2         4
3         2         5

这样用户隶属组就是
用户Name   组Name     用户ID      组ID   组映射表ID
ABC          组1        1           1        1
BCE          组1        2           1        2
DEP          组1        3           1        3
BCE          组2        2           2        4
DEP          组2        3           2        5

最后,隶属组也可以和权限有映射

用户组权限映射表
组ID   权限ID   组权限映射表ID
1        1            1
2        3            2


数据库设计的5种常见关系,其中本文主要讲“多态”关系结构,以手机为例。

1,配置关系  --和其他表无任何关系的表。
例如:webConfig里的东西你存储到表里。

2,一对多关系 ,一张表包含另外一个表的主键作为外键。
例如:手机.品牌id=2, 这里的2是[品牌名称表]的id字段为2的纪录,品牌名称是"Nokia"。一个手机只能有一个品牌。

3,多对多,需要3张表,有一个包含两个外键的关系表。
        例如: 手机1即属于"智能" 又属于"滑盖"组的, 一个组包含多个手机,一个手机可以属于多个组。

4,树型结构,常见的两钟:父ID设计和001002编码设计。
例如:手机的经销商分为 省/市/县

5,“多态”结构和多对多略有不同,如果需求中某表字段多少类型有非常大的不确定性,可以采用3个表来完成:

一个[主表](ID),
一个[属性名称表](属性ID.属性名称),
一个[属性值表],包括3个字段:
      属性值(属性Value varchar(500))
      主表ID
      属性ID

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

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

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



分享到:
评论

相关推荐

    实时/历史数据库和关系型数据库的区别

    实时数据库和关系数据库有着很多的不同,但是目前实时数据库和关系数据库集成的趋势越来越明显。将生产管理信息系统中使用的关系数据库和...其中实时数据库处理并存储生产实时数据,关系数据库处理并存储业务关系数据。

    文档型数据库与关系型数据库的比较_陈婕.pdf

    根据提供的文件信息,本文将详细探讨文档型数据库...此外,随着技术的发展,越来越多的应用场景需要同时利用两种类型的数据库,通过结合使用文档型数据库和关系型数据库,可以更好地满足复杂多变的数据管理和处理需求。

    关系型数据库和非关系型数据库.pdf

    非关系型数据库是指不使用传统的表格来存储数据,而是使用键值对、文档、图形等数据模型来存储数据。非关系型数据库的特点包括: 1. 非关系型数据库可以存储大量的数据,且具有高效的读写性能。 2. 非关系型数据库...

    实时数据库和关系型数据库的差异.pptx

    综上所述,实时数据库与关系型数据库各有优势,前者擅长处理实时生产信息,后者则在商业逻辑和并发处理方面表现出色。在构建企业信息化系统时,理解和合理利用这两种数据库的特性,是实现高效、实时的信息管理的关键...

    关系数据库管理系统实例.ppt

    4. 对应用的支持:关系数据库管理系统产品可以支持多种应用领域,如信息管理、联机事务处理、联机分析处理等。 Oracle 公司简介 Oracle 公司是世界上最大的关系数据库管理系统厂家,成立于 1977 年。Oracle 公司...

    层次,网状,关系数据库

    关系数据库具有数据独立性高、易于理解和使用的特点,但处理大规模复杂关系时可能需要优化查询性能。 在学习过程中,参考文件"层次、网状、关系数据库(参考).ppt"和"关系型数据库.ppt"会提供更详细的解释和实例,...

    一种新型的关系数据库—三维关系数据库.pdf

    现有的二维关系数据库模型对于这类数据的处理存在局限性,比如难以表达多维度之间的关系,以及在执行复杂查询时效率较低等问题。 #### 二、三维关系数据库的概念与特点 为了解决这些问题,一种新型的关系数据库...

    Hibernate多对多实例+数据库代码

    标题"Hibernate多对多实例+数据库代码"揭示了我们将在讨论一个使用Hibernate框架实现的多对多关系映射的实际案例。在这个实例中,开发人员将两个或多个实体之间的复杂关联转化为简单易懂的数据库操作。描述中提到...

    数据库处理基础、设计与实现(第八版).pdf

    - 联系:联系代表实体之间的关系,如一对多、多对多等,表示不同实体间的相互作用或关联。 - 实体-联系图(ER图):通过图形化的方式表示实体、联系以及实体的属性,是设计数据库模式的工具。 本文件可能详细讲解...

    系统结构和关系数据库

    关系数据库由多个二维表组成,表中的数据类型统一,具有严格的数学定义和结构。每张表称为一个关系,表的每一行称为元组,每一列称为属性。元组的数量称为基数,表中属性的集合称为关系的目或者度。关系模型要求每一...

    实时数据库与关系数据库的混合使用.docx

    5. 扩展性:随着业务的发展,需要考虑系统的扩展性,保证未来能轻松添加更多的实时数据源或增加关系数据库的容量。 实时数据库与关系数据库的混合使用是现代工业信息系统中的常见实践,它结合了实时响应能力和事务...

    对象数据库系统与关系数据库间特性解析

    对象-关系数据库系统(ORDBMS)试图结合两者的优势,提供扩展的数据类型和对复杂对象的支持,同时也保留了关系数据库的事务处理能力和查询效率。ORDBMS引入了如继承的概念,允许创建自定义数据类型,增强了对非结构化...

    关系数据库案例.rar

    9. NoSQL与NewSQL:作为对关系数据库的补充,NoSQL数据库(如MongoDB、Cassandra)强调灵活性和可扩展性,适合大规模非结构化数据处理;NewSQL数据库(如Google的Spanner、TiDB)试图在保持SQL易用性的同时,提供...

    Lucene与关系型数据库对比

    随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两种主流的信息管理工具,各自在特定场景下展现出了独特的优势。本文旨在深入探讨Lucene与关系型数据库之间的差异,尤其是它们在全文检索...

    实验四:NoSQL和关系数据库的操作比较

    实验要求学生不仅理解不同数据库的基本概念,还要熟练掌握它们的操作方式,这有助于深化对大数据处理中不同数据库选择的理解。通过这样的实践,可以更好地评估在特定场景下,哪种数据库更适合用于数据存储和处理。

    NoSQL非关系型数据库

    NewSQL数据库通过技术创新,如分布式事务处理、智能分片策略等,实现了对大规模数据的高效管理和处理,同时保持了关系型数据库的一些核心特性,如事务的ACID特性。 总之,NoSQL数据库是针对传统关系型数据库在扩展...

    第2章+关系数据库理论基础.ppt

    关系数据库理论基础是数据库设计与管理的核心概念,它主要涵盖了数据模型、关系模型、SQL语言、数据完整性、并发控制和事务处理等多个方面。本章将深入探讨这些关键知识点。 首先,我们来理解数据模型。数据模型是...

    多维数据库和关系数据库(第六组).docx

    关系型数据库是由IBM公司的E.F.Codd在1970年提出的,它支持通过SQL语言对数据进行操作,提供了高度灵活的数据访问机制。 #### 二、多维数据库的分类及特点 根据存储和处理方式的不同,多维数据库可以分为两类: 1...

    关系型数据库习题与解答

    例如,员工表和部门表可以通过部门ID关联,实现数据的一对多或多对多关系。 Java中的JDBC API提供了一套标准的接口和类,用于连接、查询和操作数据库。学习JDBC包括以下几个关键部分: 1. **连接数据库**:使用...

Global site tag (gtag.js) - Google Analytics