小白学做搭建网站,企业网站托管套餐,青岛网站推广 软件,苏州工业园区疾病防治中心我想对于那些已经开发了许多数据库模式的人来说#xff0c;这将是一个简单的答案#xff0c;但是我最近发现自己承担了优化(或尝试优化)数据库模式的任务#xff0c;并且一直在阅读高性能MySQL#xff0c;并且剩下一个关于在模式中使用或过度使用外…我想对于那些已经开发了许多数据库模式的人来说这将是一个简单的答案但是我最近发现自己承担了优化(或尝试优化)数据库模式的任务并且一直在阅读高性能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是多余的-基于您在(prodidcust)或(prodidcustidtimerated)上具有完全适当的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的数据库设计的好消息。