`
wusuoya
  • 浏览: 644091 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

多对多关系的数据表设计

 
阅读更多

碰到多对多 的关系,一般都是建立3 个表,m 一个,n 一个,m:n 一个。但是,m:n 有时会遇到批量处理的情况,例如到图书馆借书,一般都是允许用户同时借阅n 本书,如果要求按批查询借阅记录,即列出某个用户某次借阅的所有书籍,该如何设计呢?让我们建好必须的3 个表先:

书籍表(Book_table)
名称     类型    约束条件   说明
book_id       int          无重复         书籍标识,主键
book_no       char(20)     无重复         书籍编号
book_name     char(100)    不允许为空     书籍名称
……

 

 

借阅用户表(Renter_table)
名称     类型    约束条件   说明
renter_id     int          无重复         用户标识,主键
renter_name   char(20)     不允许为空     用户姓名
……

 

借阅记录表(Rent_log)
名称     类型    约束条件   说明
rent_id       int          无重复         借阅记录标识,主键
r_id          int          不允许为空     用户标识,和Renter_table.renter_id 关联
b_id          int          不允许为空     书籍标识,和Book_table.book_id 关联
rent_date     datetime     不允许为空     借阅时间
……

为了实现按批查询借阅记录,我们可以再建一个表来保存批量借阅的信息,例如:

批量借阅表(Batch_rent)
名称     类型    约束条件   说明
batch_id      int          无重复         批量借阅标识,主键
batch_no      int          不允许为空     批量借阅编号,同一批借阅的batch_no 相同
rent_id       int          不允许为空     借阅记录标识,和Rent_log.rent_id 关联
batch_date    datetime     不允许为空     批量借阅时间

这样的设计好吗?我们来看看为了列出某个用户某次借阅的所有书籍,需要如何查询?首先检索批量借阅表(Batch_rent) ,把符合条件的的所有记录的rent_id 字段的数据保存起来,再用这些数据作为查询条件带入到借阅记录表(Rent_log) 中去查询。那么,有没有什么办法改进呢?下面给出一种简洁的批量设计方案,不需添加新表,只需修改一下借阅记录表(Rent_log) 即可。修改后的记录表(Rent_log) 如下:

借阅记录表(Rent_log)
名称     类型    约束条件   说明
rent_id       int          无重复         借阅记录标识,主键
r_id          int          不允许为空     用户标识,和Renter_table.renter_id 关联
b_id          int          不允许为空     书籍标识,和Book_table.book_id 关联
batch_no      int          不允许为空     批量借阅编号,同一批借阅的batch_no 相同
rent_date     datetime     不允许为空     借阅时间
……

其中,同一次借阅的batch_no 和该批第一条入库的rent_id 相同。举例:假设当前最大rent_id64 ,接着某用户一次借阅了3 本书,则批量插入的3 条借阅记录的batch_no 都是65 。之后另外一个用户租了一套碟,再插入出租记录的rent_id68 。采用这种设计,查询批量借阅的信息时,只需使用一条标准T_SQL 的嵌套查询即可。当然,这种设计不符合3NF ,但是和上面标准的3NF 设计比起来,哪一种更好呢?答案就不用我说了吧。

分享到:
评论

相关推荐

    MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    由此可知,客户数据和订单数据是一对多的关系;那这样的话,问题就来了,我到底以订单中的哪一条数据为准呢?经过协商后一致同意以最新的一条数据为准; 数据测试初始化SQL脚本 DROP TABLE IF EXIST

    OA 协同办公系统 数据库设计说明书(附数据库关系表)

    表之间的关联设计是指对数据库中每个表之间的关联关系的设计,包括一对一、一对多、多对多等关联关系。表之间的关联设计需要考虑到多方面的因素,包括系统的功能需求、数据的存储和管理、数据的安全性等。 3.4 存储...

    数据表结构设计

    个人测试网站设计的数据表结构、关系。 对他人无意义,不用下载。

    学生宿舍管理系统的数据库设计(包括数据流图 实体关系图)

    本文将对学生宿舍管理系统的数据库设计进行详细的介绍,包括数据流图、实体关系图和逻辑结构设计。该系统旨在为学生宿舍管理员、学生、学校管理者和来宾提供一个便捷的信息管理平台。 数据流图 数据流图是学生宿舍...

    DAX指南:【英】实现支持多对多关系

    在多维数据模型中,多对多关系不能直接通过普通的维度与事实表的连接来表达,因为它们通常需要一个额外的桥接表来表示这种复杂的关系。在DAX中,通过使用特定的表达式来处理这种关系,为分析提供了极大的灵活性和...

    从UML类图到关系数据库表的代码生成方法

    - 多对多关系需要创建一个额外的连接表,每个表中的外键都指向对方表的主键。 4. 继承映射为表继承或单表策略:继承可以通过创建一张包含所有继承类共有字段的主表,以及一个或多个包含特定属性的子表来实现,或者...

    采购订单数据表的设计

    在IT行业中,数据库设计是至关重要的一步,尤其在企业级应用中,良好的数据表设计能够保证数据的一致性、完整性和高效性。本话题聚焦于“采购订单数据表的设计”,这是一个涉及订单管理、数据库结构以及采购流程的...

    数据字典设计文档模板

    数据字典是一种用于描述数据的结构和组织方式的文档,是数据设计和开发的重要组成部分。在设计数据字典时,需要考虑到数据的存储、处理和维护等方面,以确保数据的正确性、完整性和一致性。 在本文档中,我们将详细...

    多种权限表的设计(数据库设计)

    数据库设计的关键在于构建合理的关系模型,以支持权限的层次结构和多对多关系。主要实体包括: - **权限表**:存储所有权限信息,包括上下级关系。 - **用户表**:记录用户基本信息,关联角色和组。 - **角色表...

    数据库设计,讲解业务实体对象到数据库表的映射关系。

    - **映射关联关系**:根据关联关系的类型(一对一、一对多、多对多),确定关联表的结构和外键的位置。 - **一对一**:外键可以放置在任一端的表中。 - **一对多**:外键通常放置在“多”的一方。 - **多对多**:...

    SQL Server数据表管理生成系统的设计与实现.pdf

    3. 数据表关系设计:数据表关系设计是指对数据表之间的关系的设计,包括一对一、多对多、多对一等关系。 4. 系统实现:系统实现是指对系统的实现,包括编程语言的选择、数据库管理系统的选择、系统的测试和调试等。 ...

    数据库设计(数据字典,E-R图,模式关系等)

    关系模式是对E-R图的一种规范化表达,它定义了每个表(或关系)的结构,包括每个字段的名称、数据类型以及它们之间的约束。例如,教师关系模式为(工作证号,姓名,职称,电话,系代号),表明教师表由这些字段构成...

    数据表结构设计器 数据设计好帮手

    常见的关系型数据库管理系统(RDBMS)如MySQL、Oracle、SQL Server等,它们都是基于表格模型,由多个数据表组成,每个数据表包含一系列列和行,用来存储特定类型的数据。 数据表结构设计器主要涉及以下几个关键知识...

    全球主要国家数据表mysql

    这表明数据表可能有多个国家/地区的分类和详细信息,可以用于支持全球范围内的地理定位功能。 压缩包中的 "location.sql" 文件很可能是这个国家数据表的SQL格式文件。SQL(结构化查询语言)是用于管理关系数据库的...

    数据库SQL数据表课程设计实例 图书借阅管理 再就业信息管理 钢材仓库管理 闲置设备管理 销售业务管理系统 共16页.ppt

    这个数据库设计实例涵盖了数据库设计的方方面面,包括实体关系设计、ER 图模型、数据库设计模式、数据表设计、实体之间的关系、数据模型的应用、数据库设计的步骤、数据库设计的原则、数据库设计工具和数据库设计的...

    设计数据库(表结构设计)

    多对多关系则涉及两个表的记录可以互相有多重对应。正确设定关系有助于数据的整合和查询。 设计优化是数据库设计不可或缺的环节。检查是否遗漏了字段,主关键字是否合适,是否存在重复信息,以及表的设计是否合理。...

    数据库系统设计大全,包括数据库的设计步骤和具体流程,如何设计,以及用具体的事例实现等,还包括UML模型,以及表之间的关系等。

    3. **逻辑设计**:将E-R模型转换为关系模型,形成关系数据模型,包括各个表的设计。这个阶段会明确表的字段、数据类型、主键和外键,以及可能的索引和触发器。例如,商品表可能会有ID(主键)、名称、价格等字段,而...

    系统概要设计 数据结构设计

    总结来说,系统概要设计中的数据结构设计是一项复杂而关键的任务,涵盖了从E-R图到关系模型的转换、数据模型的优化、用户子模式设计,以及数据库的物理设计等多个层面。每个步骤都需要深思熟虑,以确保最终设计出的...

    论文研究-多关系数据分类方法综述.pdf

    多关系数据分类是多关系数据挖掘重要任务之一,它能够直接从多关系数据表中发现有效模式,比命题分类方法具有更大优势。根据知识表示形式及相关策略的不同将多关系数据分类分为归纳逻辑程序设计关系分类方法、图的...

Global site tag (gtag.js) - Google Analytics