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

我想对于那些已经开发了许多数据库模式的人来说,这将是一个简单的答案,但是我最近发现自己承担了优化(或尝试优化)数据库模式的任务,并且一直在阅读"高性能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的数据库设计的好消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解读微软开源MMLSpark:统一的大规模机器学习生态系统

AI前线导读:目前,有很多深度学习框架支持与Spark集成,如Tensorflow on Spark等。然而,微软开源的MMLSpark不仅集成了机器学习框架(CNTK深度学习计算框架、LightGBM机器学习框架),还可以将这些计…

floyd判环算法(龟兔赛跑算法)

floyd判环算法(龟兔赛跑算法) 注意,这个算法是用来判断一条链一条环的图,环的长度或者环与链的交界处的,所以此floyd非彼floyd(虽然都是一个人想出来的)。 (图不是我的) …

一个redis的连接库的实现

2019独角兽企业重金招聘Python工程师标准>>> import socketdef format_message( args):"""Create redis message:param args:Message data"""l u"*%d" % len(args)lines [l.encode(utf-8)]for arg in args:if not isinst…

matlab 边缘检测不闭合,Matlab多种图像边缘检测方法

1、用Prewitt算子检测图像的边缘I imread(bacteria.BMP);BW1 edge(I,prewitt,0.04); % 0.04为梯度阈值figure(1);imshow(I);figure(2);imshow(BW1);2、用不同σ值的LoG算子检测图像的边缘I imread(bacteria.BMP);BW1 edge(I,log,0.003); % σ2imshow(BW1);titl…

实现CSS在线美化(格式化)、压缩、加密、解密、混淆工具-toolfk程序员工具网

本文要推荐的[ToolFk]是一款程序员经常使用的线上免费测试工具箱,ToolFk 特色是专注于程序员日常的开发工具,不用安装任何软件,只要把内容贴上按一个执行按钮,就能获取到想要的内容结果。ToolFk还支持 BarCode条形码在线生成、 QueryList采集…

只是他给的实在太多了!

工作几年后,总是会问自己一个问题,工作的意义是什么?这个如果要在网络上寻找答案,那一定是多如牛毛,每一个人都有一套自己的看法。在一开始出入社会工作之时,我并没有意识到这个问题,更没有思考…

[ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)

jenkins server启动,通过jnlp的方式启动slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置项目 执行成功 转载于:https://www.cnblogs.com/iiiiher/p/7978831.html

Oracle 中UNDO与REDO的差别具体解释

一 为了更清楚的看出2者差别,请看下表: UNDO REDO Record ofHow to undo a changeHow to reproduce a changeUsed forRollback, Read-ConsistencyRolling forward DB ChangesStored …

php实现文件留言,PHP文件操作及实例:留言板

一、文件操作函数1.创建文件:touch(./xxx.php);bool touch ( string $filename [, int $time time() [, int $atime ]] )2.复制文件:copy(./xxx.php,./yyy.php);3.移动或重命名:rename(./xxx.php,./yyy.php);4.删除文件:unlink(.…

WPF-11 路由事件之一

什么是路由事件?我们从两个维度来理解路由事件:功能的角度来看,路由事件是一种事件类型,不仅仅可以在事件源上处理事件响应,还可以在元素树的多个侦听器上处理事件响应(事件侦听器是附加和调用事件处理程序的元素。事件…

个人总结的一个中高级Java开发工程师或架构师需要掌握的一些技能...

近三年,其实都是在做一个项目,项目是一个大型的多节点部署的项目,做了好几个版本,中间用到了很多技术和框架, 也用了一些管理工具和敏捷实践。我这里不是来说项目的,因为最近看了一些招聘信息,结…

Android 进程常驻(5)----开机广播的简单守护以及总结

这是一个轻量级的库,配置几行代码。就能够实如今android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下。clean master获取root权限下都无法杀死进程 支持系统2.3到6.0 支持大部分设备,包含三星。华为。oppo&#xff0…

[k8s]metricbeat的kubernetes模块kube-metric模块

正确姿势启动metricbeat metricbeat.modules: - module: systemmetricsets:- cpu- filesystem- memory- network- processenabled: trueperiod: 10sprocesses: [.*]cpu_ticks: falseoutput.elasticsearch:hosts: ["http://192.168.x.x:9200"]setup.template.name: &q…

如何为 Task 添加超时功能

前言假设有如下代码,功能是首先从缓存获取数据,如果没有命中缓存,则直接从数据库获取:var data await GetFromCache(); if (data is null) {data await GetFromDB(); }对于获取缓存数据,我们需要限制一下GetFromCach…

php 随机指定位数,php生成一个可选位数的随机码

echo coding(6);function coding($num){$str_arr array(‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘h‘,‘i‘,‘j‘,‘k‘,‘l‘,‘m‘,‘n‘,‘o‘,‘p‘,‘q‘,‘r‘,‘s‘,‘t‘,‘u‘,‘v‘,‘w‘,‘x‘,‘y‘,‘z‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘,‘G‘,‘H‘…

Animate与transform的使用

Animate是用css给前端加载动画的效果&#xff1a; 网址&#xff1a;https://daneden.github.io/animate.css/ <!DOCTYPE html> <html lang"en"> <head><link rel"stylesheet" href"static/css/Animate.css"><meta ch…

angular中的cookies与cookieStore区别

设置cookie用put()方法: $cookies.put(key, value[, options]); $cookieStore.put(key, value); 例如设置一个cookie&#xff0c;名为“userName”&#xff0c;值为“yangmin”&#xff1a; //使用$cookies设置cookie $cookies.put(userName, yangmin); //使用$cookieStore设置…

ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器

通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件。对于ASP.NET应用来说&#xff0c;如果将静态文件存储到约定的目录下&#xff0c;绝大部分文件类型都是可以通过Web的形式对外发布的。“Microsoft.AspNetCore.StaticFiles” 这个NuGet包中提供了三个用来处…

js 栈(进制转换)

<!DOCTYPE html>Documentposted 2017-12-07 19:33 mysure 阅读(...) 评论(...) 编辑 收藏 刷新评论刷新页面返回顶部转载于:https://www.cnblogs.com/ar13/p/8000718.html

流程展示 php,js实现动态的流程进度展示条

这次给大家带来js实现动态的流程进度展示条&#xff0c;js实现动态流程进度展示条的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。一、设计思路分为以下几步(仅供参考)【竖线线】这个采用ul的list标签制作&#xff0c;保证了可随时添加&#xff0c;以…