我想对于那些已经开发了许多数据库模式的人来说,这将是一个简单的答案,但是我最近发现自己承担了优化(或尝试优化)数据库模式的任务,并且一直在阅读"高性能MySQL",并且剩下一个关于在模式中使用或"过度使用"外键关系的问题。例如,假设我有以下表格:

CUSTOMERS:

__________________________________

|CustIDPK|  Name  |   RegDate    |

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

|   1    |  frank |  01-30-2014  |

|   2    |  terry |  02-01-2014  |

|   3    |  amber |  02-02-2014  |

|   4    |  sara  |  02-06-2014  |

PRODUCTS:

____________________________________

| ProdIDPK | ProdName | AddedDate  |

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

|    1      |  Phone  | 01-01-2014 |

|    2      |   TV    | 01-02-2014 |

|    3      | Tablet  | 01-02-2014 |

|    4      |   PC    | 01-05-2014 |

PRODUCT_RATINGS:

__________________________________________________________________

| ProdRateIDPK |  ProdIDFK |  CustID |  Rating |    TimeRated    |

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

|     1        |     1     |    1    |   8     |   01-01-2014    |

|     2        |     1     |    2    |   7     |   01-01-2014    |

|     3        |     1     |    3    |   8     |   01-02-2014    |

|     4        |     2     |    4    |   6     |   01-02-2014    |

|     5        |     2     |    4    |   6     |   01-03-2014    |

|     6        |     2     |    3    |   4     |   01-01-2014    |

|     7        |     3     |    2    |   5     |   01-02-2014    |

|     8        |     3     |    1    |   7     |   01-03-2014    |

|     9        |     3     |    1    |   4     |   01-04-2014    |

|     10       |     4     |    2    |   9     |   01-04-2014    |

|     11       |     4     |    3    |   8     |   01-01-2014    |

|     12       |     4     |    4    |   7     |   01-01-2014    |

CUSTOMERS表独立于PRODUCTS表而存在,因此未定义任何关系。由于任何一种产品都可以具有许多等级,因此PRODUCTS表与PRODUCT_RATINGS表具有一对多的关系。这很明显。

现在,在PRODUCT_RATINGS表中的现有架构中,CustID列是CUSTOMERS表的外键,代表与产品评分的一对多关系,因为任何用户都可以在该表中拥有许多评分(每个评分代表一个单独的产品)。

我的问题:" CustID"列是否应定义为与CUSTOMERS表建立一对多关系的外键?我看不到在哪里需要此数据的联接。据我所知," CustID"列仅在应用程序中用于区分哪个客户发布了评级...

请注意,在此模式下ProdRateIDPK是多余的-基于您在(prodid,cust)或(prodid,custid,timerated)上具有完全适当的PK

任何两个表都可以连接。 它们之间存在FK只是意味着该联接将为每个引用的表行包含一个结果行。 只需向它们声明所有候选键(即最小的PK / UNIQUE列集,即不包含较小者的列集)和FK。 (SQL要求您声明在FK中引用的PK / UNIQUE列集。因此,您还必须声明那些非最小的PK / UNIQUE列集和与之对应的FK,因此它们实际上是外来超键。)

我不熟悉您提到的这个问题:"在架构中"过度使用"外键关系"。 通常问题是使用不足。

定义外键关系有几件事情。 最重要的是,它保证PRODUCT_RATING s表中的CustId列在CUSTOMERS表中是有效的CustId。 那很有用。

这样做有后果,但是要弄清楚这种关系的存在是好的模式设计的一部分。 不能通过不寻常的"优化"概念来消除它。

我认为通过我进行循环的事情是当他们开始谈论针对您的特定需求进行规范化和非规范化,并开始认为如果没有发生联接,则无需在PRODUCT_RATINGs表中将CustID列作为外键进行索引。 。 我了解您对保证CustID有效的含义。 如果删除客户,但仍然存在不相关的数据,可能会导致严重的问题。

是,product_ratings表中的CustId字段应该是客户表的外键。 这就是数据库规范化的全部内容。 我没有读过与您读过的同一本书,但是我听说过有关Mere Mortals的数据库设计的好消息。

mysql主外键引用关系,关于mysql:数据主/外键关系相关推荐

  1. oracle 建立外键 引用条件约束 不能添加,Oracle外键约束(Foreign Key)的几个操作选项...

    关系型数据库是以数据表和关系作为两大对象基础.数据表是以二维关系将数据组织在DBMS中,而关系建立数据表之间的关联,搭建现实对象模型.主外键是任何数据库系统都需存在的约束对象,从对象模型中的业务逻辑加 ...

  2. oracle 建立外键 引用条件约束 不能添加,Oracle外键约束

    一.创建外键约束 两种方法 1.创建表时 create table 子表( id number, name varchar2(5), foreign key(id) references 父表(列名) ...

  3. js中将有层级关系的一维数据转换为父子级关系的二维数据、菜单权限三级层级数据实现(树形结构数据)

    很久没有发文了,今天发点不一样的,如下: <script>// 一维数据:let arrData=[{ r_id: 1, role_name: '开发商', n_id: 1, txt: ' ...

  4. usb键码转linux键值,CH554串口接收数据转USB键值程序 CH559模拟USB复合设备,键鼠,支持类命令...

    /********************************** (C) COPYRIGHT ******************************* * File Name        ...

  5. MySql基础篇---001 数据库概述与MySQL安装篇:概述,表和类对应关系,表关系、数据库卸载,下载,安装,配置,启动,登录,演示,图形化工具,目录结构,常见问题

    第01章_数据库概述 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. 为什么要使用数据库 持久化(persistence):把数据保存到可掉电式存储 ...

  6. mysql 主键引用外键_mysql 主键与外键

    一.主键详解,引用自:https://blog.csdn.net/haiross/article/details/50456154 1.要设置主键自增的话字段必须是整形数字. 二.外键详解:引用自ht ...

  7. MySQL→数据库、启动连接数据库、SQL→DDL数据定义语言及数据类型、DML数据操作语言、DQL数据查询语言、数据库约束→主键、唯一、非空、默认、外键、SQL、三大范式及一多关系、视图、内外连接

    MySQL连接退出命令 mysql –uroot -proot mysql –h127.0.0.1 –uroot -proot mysql --host=localhost --user=root - ...

  8. mysql中有主键和外键吗_谈谈mysql的主键和外键

    主键:保证数据的唯一性,非空且唯一,一般设置主键的语法为:字段 类型 PRIMARY KEY;或者 字段 类型,PRIMARY KEY(字段名) 外键:保证数据的完整性,一致性.一般设置的外键关联的是 ...

  9. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]

    列属性 列属性又称为字段属性. 在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自增长. NULL属性 NULL属性代表字段为空. 如果对应的值为yes表示该字段允许为null, ...

最新文章

  1. 用Python预测收入,来看看你的收入到底应该是多少?
  2. 给新手看的 Micronaut 入门教程,10 分钟写出一个 Micronaut 程序
  3. c++ socket学习(1.2)
  4. [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)...
  5. VMWare 8 安装 Mac OS 10.7 (Lion)版 【转】
  6. 安卓“新皇”来了!华为Mate 40确定10月22日发布
  7. 瑞星专家:lpk.dll病毒的现象和手工处理
  8. 如何在Eclipse中从XSD生成XML
  9. 【图神经网络】从源头探讨 GCN 的行文思路
  10. win7 gho封装教程
  11. Win7 AERO主题变成灰色解决方法
  12. 最基本的计算机度量单位是什么意思,计算机常用的度量单位
  13. 24V电压TVS二极管选型
  14. html盒子页面居中,网页布局盒子(box)相关属性和盒子居中
  15. SpringBoot+Shiro实现登陆拦截功能
  16. android单机斗地主,单机斗地主最新安卓版
  17. Merlin:一个开源的神经网络语音合成系统
  18. 51nod 13831048 整数分解为2的幂 [递推]【数学】
  19. 图片灯箱插件——lightBox
  20. 漏洞分析丨HEVD-0x2.StackOverflowGS[win7x86]

热门文章

  1. 第2天.make的学习(第二部分)对伪目标的理解
  2. django基础1--django安装与helloworld测试
  3. windows7 + vs2008 + oracle + iis7 客户端配置成功
  4. 为什么用 windbg 看 !address 显示出的Free是128T 大小?
  5. .Net/C#分库分表高性能O(1)瀑布流分页
  6. C# 使用AggregateException 信息
  7. C# 用IrisSkin4.dll美化你的WinForm
  8. WTMPlus 低代码平台来了
  9. .NET gRPC核心功能初体验
  10. C# 规则引擎RulesEngine