数据库设计中一对多的解决方法.

1.位运算的思想

原文连接:http://www.tiyee.net/post/178 作者:tiyee

当我们在设计数据库的数据表时,经常会遇到一对多的数据结构,如文章的tag等,比如本人之前在设计手机app的后端的时候,就碰到了这个问题,

当时涉及中小学教材的诗歌诗歌表(poetry)和出版社表(poetry_press),因为一首诗可能会涉及多个出版社,而且出版社的数量并不是很多。为了便于搜索,如果把所有出版社的ID用分隔符组合成一个字符串肯定不符合要求。所以一般都是单独使用一个表来存储他们的对应关系,每次修改的时候,还必须先清除所有的对应数据,然后重新插入,非常麻烦,为了保证数据的一致性,还必须用事物。很显然,对于关联数据种类很少的情况下,这两种方法都不好。

在linux里,读写运行权限用421来表示,这就是一个典型的一对多的场景,比如用7就可以表示同时拥有3种权限,7表示读写权限。居于此,我们便设计了两个数据表

mysql> describe poetry; +----------+---------------------+------+-----+---------+----------------+ | Field    | Type                | Null | Key | Default | Extra          | +----------+---------------------+------+-----+---------+----------------+ | id       | int(4) unsigned     | NO   | PRI | NULL    | auto_increment | | sTitle   | varchar(255)        | NO   |     | NULL    |                | | sContent | text                | YES  |     | NULL    |                | | nSort    | tinyint(1) unsigned | NO   |     | 0       |                | | nStatus  | tinyint(1) unsigned | NO   |     | 0       |                | | nPress   | int(4) unsigned     | NO   |     | 0       |                | +----------+---------------------+------+-----+---------+----------------+ 6 rows in set (0.03 sec) 
mysql> describe poetry_press; +---------+---------------------+------+-----+---------+----------------+ | Field   | Type                | Null | Key | Default | Extra          | +---------+---------------------+------+-----+---------+----------------+ | id      | int(4) unsigned     | NO   | PRI | NULL    | auto_increment | | sName   | varchar(255)        | NO   |     |         |                | | nSort   | tinyint(1) unsigned | NO   |     | 0       |                | | nStatus | tinyint(1) unsigned | NO   |     | 0       |                | +---------+---------------------+------+-----+---------+----------------+ 4 rows in set (0.02 sec) 

为了说明一下,我们添加点数据,添加后数据如下,

mysql> select * from poetry_press; +----+--------------+-------+---------+ | id | sName        | nSort | nStatus | +----+--------------+-------+---------+ |  1 | 人教版       |     0 |       1 | |  2 | 北师大版     |     0 |       1 | |  3 | 新课标       |     0 |       1 | |  4 | 思泉版       |     0 |       1 | |  5 | 苏教版       |     0 |       1 | +----+--------------+-------+---------+ 5 rows in set (0.02 sec) 

那么,假如一首诗属于人教版和北师大版,则加起来数字为2^1+2^2 = 6.如果属于人教版,新课标,苏教版,则为2^1+2^3+2^5 = 42.

我们如果要查询人教版的诗歌,则可以

 SELECT * FROM `poetry` WHERE `nPress` & 2 = 2  

如果我们要查既属于人教版,又属于北师大版,则sql语句为

SELECT * FROM `poetry` WHERE `nPress` & 6 = 6 

假如我们要给第3条记录添加人北师大版本,则sql语句为

UPDATE `poetry` SET `nPress` = `nPress` | 4 WHERE `id` = 3 

假如我们要给第3条记录删除人北师大版本,则sql语句为

UPDATE `poetry` SET `nPress` = `nPress` ^ 2 WHERE `id` = 3

2. 原文: http://www.cnblogs.com/lgxlsm/archive/2013/05/15/3080994.html

数据库设计(一对一、一对多、多对多)

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

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

一对一外键关联,图示如下:

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

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

()

(等一下, 主键pk可以有两个??)

时间: 2024-08-04 06:40:27

数据库设计中一对多的解决方法.的相关文章

简述数据库设计中一对多和多对多的应用场景?

做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表.然而在实际开发过程中,一对多,多对多的表处处都是!简单整理一下,一对多,多对多表如何设计整理一下思路:     数据库实体间有三种对应关系:一对一,一对多,多对多. 一对一关系示例: 一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号. 一对多关系示例: 一个学生只属于一个班,但是一个班级有多名学生. 多对多关系示例: 一个学生可以选择多门课,一门课也有多名学生. 一.关系的实现 在实体关系模型中,我们知道有三种关系:一对

数据库设计中一对一、多对一、多对多关系依据外键的实现条件及方法

作者:二歪求知iSk2y链接:https://www.jianshu.com/p/2b27c7ba0653来源:简书 下面以departments和staff_info表为例(为staff_info添加指向departments的外键) 一个表的字段作为外键的条件: 列值必须非空且唯一 测试例子如下: mysql> create table departments (dep_id int(4),dep_name varchar(11)); Query OK, 0 rows affected (0

数据库设计中的一些原则

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体. 这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.   这就是"一张原始单证对应多个实体"的典型例子. 2.

(zz)数据库设计中的14个技巧

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实 体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计 录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会 关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子. 2. 主键与外键

[转]数据库设计中的常用技巧

本文介绍了数据库设计中的14个技巧,这是许多人在大量的数据库分析与设计实践中,逐步总结出来的-- 下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的.对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握.并逐步做到:在应用中发展,在发展中应用. 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个

数据库设计中的13个技巧

1.原始单据与实体之间的关系可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会关系表.工作简历表.这就是"一张原始单证对应多个实体"的典型例子. 2.主键与外键一般而

数据库设计中常见表结构的设计技巧(转)

一.树型关系的数据表 不少程序员在进行数据库设计的时候都遇到过树型关系的数据,例如常见的类别表,即一个大类,下面有若干个子类,某些子类又有子类这样的情况.当类别不确定,用户希望可以在任意类别下添加新的子类,或者删除某个类别和其下的所有子类,而且预计以后其数量会逐步增长,此时我们就会考虑用一个数据表来保存这些数据.按照教科书上的教导,第二类程序员大概会设计出类似这样的数据表结构: 类别表_1(Type_table_1) 名称 类型 约束条件 说明 type_id int 无重复 类别标识,主键 t

数据库设计中的14个技巧

1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实 体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计 录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表.社会 关系表.工作简历表.这就是“一张原始单证对应多个实体”的典型例子. 2. 主键与外键

数据库设计中的14个技巧(转)

转自http://blog.csdn.net/sirfei/article/details/434994 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对 应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实 体,或多张原始单证对应一个实体.这里的实体可以理解为基本表.明确这种对应关系后,对我们设计 录入界面大有好处. [例1]:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员