本小菜在设计数据库的时候,不幸遇到这样一个问题:

数据库中有两个表,分别是小组表和成员表。其中小组表中有一个创建者字段,成员表中有一个所属组字段。

看着挺符合逻辑的设计,却引发了一个哲学问题:先有鸡先有蛋?两个表形成了互相依赖。在数据库刚刚建成的时候,两个表中都没有数据,那么向任何一个表中插入数据都是失败的。

出现问题就要马上解决,于是我便到网上搜索,找到这样一句话:“如果两表互有关联,则为多对多的关系,按照第三范式规定,建立第三个中间表,用于存储两表主键,关联时使用第三表的字段进行关联.”。按照这个规则所说的,建立两个中间表,用来存储组表的主键和成员表的主键(另一个表反之),然后用这两个中间表进行关联,这样可以完美解决这个问题。

因为这两个中间表解除了组表和成员表直接的相互依赖,转化为了两个中间表对组表和成员表的依赖。这样看上去貌似不错,可是仔细观察一下会发现,在这个问题中并不是多对多的关系:一个组只有一个创建者,一个成员只能属于一个组。

虽然可以用多对多的方法解决,但这并不是问题的根源。那么问题出在哪里呢?试想一下,假如我们要创建一个组,必须由人来创建,人的层次要高于组,而现在的设计人和组处于一个对等的层次上,这样显然是不合理的。之所以这样,是因为当初设计的时候,把所有的成员都放在一个表中,不分普通用户、操作员、管理员,这样就导致降低了管理员的层次,从实际情况分析,管理员应该是不属于某一组的。

所以,要真正解决这个问题,必须把具有管理功能的角色与普通角色分开,管理角色在组的层次之上,没有所属组,但是有创建组的权限;而普通角色的层次在组之下,必须属于某一组,没有创建组的权限。这样就比较切合实际的解决了这个问题。需要说明的是,AdminMember表和NormalMember表只是代表权限分级域表,并不表示成员类型,比如AdminMember 表中可以放超级管理员、管理员、操作员等用户类型,在NormalMember表中可以有组员、组长、小组长等用户类型,在MemberAll表中应该还有TypeID字段,来标识成员的类型。因此,在设计数据库的时候,一定要分析表的层次结构,划分出明确的域,避免出现互相依赖这样的错误设计。

即便是这样,个人感觉这个设计还不是很合理。可以看出,假如我们删除了某一个属于AdminMember表域的用户,那么这个用户所创建的组也会由于外键约束不得不删除。这在实际应用中显然是非常不合理的,这样会导致系统混乱不堪。

因此,我认为虽然AdminMember表和Group表理论上有外键约束关系,但是实际设计数据库时不能加这个约束,我们只是为了记录一下组的创建者,进而提供一些参考,并没有严格的完整性要求,如果这个创建者不存在了,组应该还在。

先有鸡还是先有蛋:数据库中的相互依赖相关推荐

  1. 菌群与疾病的关系探讨之一:先有鸡还是先有蛋?

    本文转载自"态昌基因",己获授权. 掐指一算,小昌也是有十几年菌群研究项目经验的老司机了,本以为做的多会的多,结果却是做得越多疑问越多,所以小昌对菌群研究的评价就是"这里 ...

  2. 先有鸡还是先有蛋? 加拿大科学家揭开谜底

    据美国生活科学网报道,鸡和蛋先后之争持续已久,究竟是先有的鸡还是先有的蛋,这一让人百思不得其解的古老谜题终于有了谜底.通过对7700万年前的恐龙蛋化石的研究后,科学家宣布谜题答案是先有的蛋后有的鸡. ...

  3. java毕业设计坝上长尾鸡养殖管理系统Mybatis+系统+数据库+调试部署

    java毕业设计坝上长尾鸡养殖管理系统Mybatis+系统+数据库+调试部署 java毕业设计坝上长尾鸡养殖管理系统Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  4. 先有鸡还是先有蛋,程序员怎么看

    先有鸡还是先有蛋,这个问题你是否也想过?这种具有互相依赖关系的情况,其实相对于经常接触电子产品和信息系统的程序员来说,也很常见.你有没有想过,这种现象就好比现代CPU的设计,需要在PC电脑上设计,而P ...

  5. 《系统思考》:先有鸡还是先有蛋?(转)

    <系统思考>:先有鸡还是先有蛋? 关于作者,关于本书 本书的作者是丹尼斯·舍伍德.丹尼斯曾就读于剑桥大学.耶鲁大学.加州大学以及伦敦商学院. 丹尼斯在学术界享有盛名,著述颇丰.他曾以合伙人 ...

  6. 蛋鸡问题,先有鸡还是先有蛋。顺便回答第一个编译器是怎么来的。(思考使人伟大)

    生活中存在着一些自举的例子,这些例子常被拿来做为思维狡辩的工具,它们确实也起到了让普通人思维混乱的作用. 问题如下: 1.  蛋鸡问题,鸡可以生蛋,蛋可以孵出鸡,那么到底先有鸡还是先有蛋? 2.  人 ...

  7. 破旧立新破解先有鸡还是先有蛋

    这个世界上是先有鸡还是先有鸡蛋呢? 这是一个流传极广的难题,往往被认为无法回答,算是一个"看起来很简单,实际上异常困难"的典型. 先有鸡还是先有蛋之所以无法解答,并非真的有多难,而 ...

  8. 逃不出的循环,先有鸡还是先有蛋?object和type纠葛(python中的基类和元类)

    问题 学习一段时间python了,一定会接触到两个词,基类和元类. 基类: 也叫父类,python中所有对象的终极父类是object,所有类都显式或隐式,直接或间接地继承了object类. 元类: 由 ...

  9. 用C#写C#编译器,先有鸡还是先有蛋

    前段时间翻译的一篇文章 微软是如何重写C#编译器并使它开源的,文章讲了微软用C#重写C#编译器的坎坷路,引发了一些童鞋的思考:用C#编写C#编译器(Roslyn),那么C#编译器本身是由谁来编译的?C ...

最新文章

  1. 程序开发中那些莫名奇妙的bug
  2. Contextualization
  3. LeetCode Algorithm 268. 丢失的数字
  4. localhost与127.0.0.1之间的关系更改
  5. java或异运算_java中与运算,或运算,异或运算,取反运算
  6. 基于javaweb的公交查询系统的设计与实现(含源文件)
  7. 高性能javascript学习总结(2)--DOM编程
  8. Hadoop实战(3)_虚拟机搭建CDH的全分布模式
  9. Linux对I/O端口资源的管理(5)
  10. 消息中间件activemq-5.13.0安全验证配置
  11. MCMC采样算法理解
  12. 【学生信息管理系统】-优化篇1
  13. linux征途架设教程,Linux下征途私服架设详细教程
  14. html 大转盘游戏,HTML5 Canvas大转盘抽奖活动页面代码
  15. 曼哈顿算法公式_距离计算方法总结 | Public Library of Bioinformatics
  16. echarts 水滴图实现方式。
  17. 【prometheus】计算CPU使用率
  18. ubuntu 20.04 ssh “Key exchange failed“
  19. html天气插件iframe,HTML_利用iframe在网页中显示天气附效果截图,css: 复制代码代码如下: *{margi - phpStudy...
  20. android本地化,Android本地化

热门文章

  1. 黑客攻击常用端口详解总结
  2. MySQL Day01
  3. 1.工厂模式获取服务实例
  4. 不用工具查看dll的导出函数名的方法!
  5. Android游戏开发之游戏帧动画的播放与处理(七)
  6. 通过微博用户名称获取用户id及用户的文章详情
  7. 11111111111111111
  8. 关于 Qt Creat
  9. Excel 2016双击文件打开后是空白,再次双击才能打开(或者通过文件,打开才能打开)...
  10. bzoj1143[CTSC2008]祭祀river