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.pswp.cn/news/281689.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281689.shtml
英文地址,請注明出處:http://en.pswp.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;以…