深入了解數據庫設計中的規范化與反規范化

目錄

零、前言

一、一些基本術語

二、關系模式

2.1. 什么是關系模式

2.2.?示例

三、數據依賴

3.1. 函數依賴

3.1.1. 完全函數依賴

3.1.2. 部分函數依賴

3.1.3. 傳遞函數依賴

3.2. 多值依賴

3.3. 連接依賴

四、規范化

4.1. 第一范式(1NF)

4.2. 第二范式(2NF)

4.3. 第三范式(3NF)

4.4. 巴斯-科德范式(BCNF)

4.5. 第四范式(4NF)

4.6. 第五范式(5NF)

4.7. 第六范式(6NF)

五、反規范化

5.1. 冗余列

5.2. 派生列

5.3.?表重組

5.4.?表分割

5.4.1. 水平分割

5.4.2.?垂直分割


零、前言

????????為了更好的理解數據庫設計的規范化和反規范化,我們需要先弄清楚什么是函數依賴,以及函數依賴的分類,而要理解函數依賴,就要先明白什么是關系模式。所以,本文從關系模式開始,再依次講解函數依賴和規范化以及反規范化。

一、一些基本術語

  1. 屬性 (Attribute): 在現實世界中,要描述一個事物常常取若干特征來表示。這些特征稱為屬性。例如學生通過學號、姓名、性別、系別、年齡、籍貫等屬性來描述。

  2. 域 (Domain): 每個屬性的取值范圍對應一個值的集合,稱為該屬性的域。例如,學號的域是6位整型數;姓名的域是10位字符;性別的域為{男,女}等。

  3. 目或度 (Degree): 目或度指的是一個關系中屬性的個數。

  4. 候選碼 (Candidate Key): 若關系中的某一屬性或屬性組的值能唯一的標識一個元組,則稱該屬性或屬性組為候選碼。

  5. 主碼 (Primary Key): 或稱主鍵,若一個關系有多個候選碼,則選定其中一個作為主碼。

  6. 主屬性 (Prime Attribute): 包含在任何候選碼中的屬性稱為主屬性。不包含在任何候選碼中的屬性稱為非主屬性 (Non-Prime Attribute)。

  7. 外碼 (Foreign Key): 如果關系模式 R 中的屬性或屬性組不是該關系的碼,但它是其他關系的碼,那么該屬性集對關系模式R 而言是外碼。例如,客戶與貸款之間的借貸聯系 c-1(c-id,loan-no), 屬性c-id是客戶關系中的碼,所以c-id 是外碼;屬性 loan-no是貸款關系中的碼,所以loan-no 也是外碼。

  8. 全碼 (All-key): 關系模型的所有屬性組是這個關系模式的候選碼,稱為全碼。例如,關系模式R(T,C,S), 屬性 T 表示教師,屬性C 表示課程,屬性S 表示學生。假設一個教師可以講授多門課程,某門課程可以由多個教師講授,學生可以聽不同教師講授的不同課程,那么,要想區分關系中的每一個元組,這個關系模式R 的碼應為全屬性 T、C和 S,即ALL-KEY。

二、關系模式

2.1. 什么是關系模式

????數據庫的關系模式是關系型數據庫中用于描述數據庫結構和數據之間關系的一種方式。它是對數據庫中關系(表)的邏輯結構進行定義,可以形式化地表示為:R(U,D,dom,F),其中每個元素都有特定的語義,使用這樣的表示方法可以幫助數據庫設計者規范地描述數據庫中的數據結構,以及數據之間的邏輯關系。這有助于確保數據的完整性和準確性,并為數據庫的查詢和操作提供了一個清晰的基礎。

通常,我們可以將關系模式簡記為R(U)。

  • R:表示關系的名稱,代表數據庫中的一個表或關系。
  • U:表示關系R的屬性集合。這些屬性定義了關系中的列。
  • D:表示屬性集合U中每個屬性的域或數據類型集合。域是對屬性可能值的限制,確保每個屬性的值都屬于其指定的數據類型。
  • dom:表示屬性集合U中每個屬性的值域,是屬性到域的映像集合;
  • F:表示關系R的函數依賴集合。

2.2.?示例

????假設我們有一個關系模式叫做“學生成績”,它用于存儲學生的信息和他們的成績。我們可以用R(U,D,dom,F)來描述這個關系模式:

  • R:“學生成績”
  • U:{學號, 姓名, 課程, 成績}
  • D:{整數, 字符串, 字符串, 浮點數}
  • dom:
    • 成績:分數,例如“90.5”

    • 課程:課程名稱,例如“數學”

    • 姓名:學生的名字,例如“張三”

    • 學號:唯一的 student ID,例如“S12345”

  • F:{學號→姓名, (學號,課程)→成績}

????在這個例子中,學號決定了學生的姓名和課程,因為每個學生只有一個學號,而且每個課程的成績也是由特定的學號和課程共同決定的。這樣的函數依賴集合確保了數據的完整性和一致性。例如,如果我們有一個學生的學號是“S12345”,那么我們可以通過學號查找到對應學生的姓名。同時,如果我們知道一個學生選修了“數學”課程,我們可以查找該課程的成績。

????以上關系模式,可以簡記為:學生成績(學號, 姓名, 課程, 成績)

三、數據依賴

3.1. 函數依賴

????在上述關系模式中的說明中,我們提到了函數依賴(F),數據庫中的函數依賴是描述關系型數據庫中表的屬性之間相互依賴關系的概念。它反映了表中數據屬性之間的邏輯關系,即一個屬性或屬性集是否能夠決定另一個屬性或屬性集的值。

????在關系型數據庫中,一個關系(表)由多個屬性(列)組成。函數依賴定義了這些屬性之間的規則,說明了一個屬性的值如何決定另一個屬性的值。函數依賴有助于確保數據的準確性和一致性。

????通俗來講,函數依賴是使關系模式的屬性間的數據依賴達到一種“函數”的效果,即根據一個或多個屬性,能夠推導出唯一的另一個屬性,它描述的實際上是屬性之間1對1或n對1的關系。

????函數依賴主要有三種類型:完全函數依賴、部分函數依賴以及傳遞函數依賴

3.1.1. 完全函數依賴

? ? 當一個屬性集合A完全決定另一個屬性集合B時,我們說B完全函數依賴于A。這意味著A中的每個值都決定了B中的一個唯一值。例如,(學號,課程號)?→ 成績,這里學號和課程號單獨拿出來都不能決定成績,只有學號和課程號一起才能決定一個成績。

3.1.2. 部分函數依賴

??????????????? ??當一個屬性集合A的部分成員決定了另一個屬性集合B時,我們說B部分函數依賴于A。這意味著A中的某些值可能決定多個B的值。例如,(學號,課程號)?→ 學生姓名,這里學號和課程號放在一起可以決定學生的姓名,但是它不滿足完全函數依賴,因為學號單獨拿出來也能決定學生姓名。

3.1.3. 傳遞函數依賴

??????????????????當一個屬性集合A通過中間屬性集合B決定另一個屬性集合C時,我們說C傳遞函數依賴于A。這意味著A中的每個值通過B決定了C中的一個唯一值。例如,學號 → 所在班級,所在班級?→ 班主任,這里班主任依賴于所在班級,而所在班級又依賴于學號。

3.2. 多值依賴

????多值依賴是函數依賴的一種擴展,它用于描述一個屬性集合對另一個屬性集合的多值關系。在關系模式R(A, B, C)中,如果對于R中的任意兩個元組t1和t2,當t1在屬性A上的值等于t2在屬性A上的值時,t1在屬性B上的值集合必須等于t2在屬性B上的值集合,那么我們說B多值依賴于A,記作A →→ B。多值依賴表達了屬性間的一種更為復雜的關系。

?????與函數依賴描述1對1或n對1的關系不同,多值依賴主要描述屬性之間1對n或m對n的關系。如下圖,在圖中的關系模式中,其屬性關系為:科目與學生之間、科目與教師之間均存在多對多的關系,但學生和教師之間沒有任何直接關系:

????將這些對應關系拆分則得到了如下兩個子關系:

????此時,我們稱學生、科目和教師這三個屬性之間存在多值依賴。

3.3. 連接依賴

? ??根據《計算機科學技術名詞 》第三版的定義,如果將關系 R的所有屬性在R的實例I上分別進行投影操作,然后將這些投影的結果進行連接運算后其結果仍等于I,則稱該實例I 滿足連接依賴。

? ? 以上定義或許不太好理解,這里還是以上面提到的關系為例,但在這個關系模式中,其語義約束變為:學生與科目之間、學生與教師之間、科目與教師之間均存在多對多的對應條件:

????將這些對應關系拆分則得到了如下三個子關系:

????此時重新將R1、R2和R3三張子表進行自然連接運算之后,可以無損地還原出原始關系R,則我們稱學生、科目和教師這三個屬性之間存在連接依賴。

????到這里便可以發現,連接依賴和多指依賴都是由多對多或多對一的聯系而產生的,如果三個屬性之間任意兩個屬性均存在多對多或多對一的關系,則稱這三個屬性之間存在連接依賴, 否則稱這三個屬性之間存在多值依賴。

四、規范化

????????數據庫設計規范化(Database Normalization)是數據庫設計中的一種重要方法,旨在通過優化數據庫結構來提高數據的一致性和完整性,減少數據冗余,增強數據修改的靈活性,并降低數據查詢的復雜性。規范化通常涉及將大表拆分成更小、更專門的表,并通過定義表之間的關系來連接這些表。通常可以通過判斷分解后的模式達到幾范式來評價模式規范化的程度。范式從低到高依次為:1NF、2NF、3NF、BCNF、4NF以及5NF。在實際應用中,3NF已經足夠滿足大多數數據庫設計的需求。下面依次對這些范式進行說明:

4.1. 第一范式(1NF)

????若存在學生表如下:

????在此學生表中,Courses包含了學生所選的所有課程,這種表設計使得查詢某課程被哪些學生選擇變得復雜,并且在新增選課、取消選課時也需要先分解Courses字段才能進行處理。為了解決這種問題,提出了1NF。

????1NF的目標是確保表中的每一列都是不可分割的基本數據項,主要關注的是確保每列的原子性,即沒有集合、數組、記錄等復雜數據類型。例如,供應者和它所提供的零件信息,關系模式 FIRST和函數依賴集F 如下:

????FIRST(Sno,Sname,Status,City,Pno,Qty)

????F={Sno → Sname,Sno → Status,Status → City,(Sno,Pno)→ Qty}

? ??對具體的關系 FIRST 如圖所示,可以看出,每一個分量都是不可再分的數據項,所以是1NF的。

4.2. 第二范式(2NF)

? ? 在以上關系模式中,我們可以看到它的候選碼為(Sno,Pno),存在部分函數依賴(Sno可以單獨推斷出Sname和Status),這就導致其存在插入異常刪除異常的問題,所謂插入異常,是指按照關系模式實體完整性規定主碼不能取空值或部分取空值(由于候選碼只有一個,所以(Sno,Pno)也是主碼)。這樣,當某個供應者的某些信息未提供時(如 Pno), 則不能進行插入;而刪除異常是指若供應商S4的P2零件銷售完了,并且以后不再銷售P2零件,那么應刪除該元組,可S4 又是客觀存在的,不能因此刪除。而為了解決插入異常和刪除異常,就有了2NF。

????2NF的目的是消除部分函數依賴,要求非主鍵列必須完全依賴于整個主鍵,而不能僅依賴于主鍵的一部分。比如,為了消除以上示例中的部分函數依賴,我們可以將FIRST關系分解為:

????FIRST1(Sno,Sname,Status,City)

????FIRST2(Sno,Pno,Qty)

????因為分解后的關系模式FIRST1的碼為 Sno, 非主屬性 Sname、Status、City完全依賴于碼Sno, 所以屬于2NF; 關系模式FIRST2的碼為 (Sno,Pno), 非主屬性Qty完全依賴于碼,所以也屬于2NF。

4.3. 第三范式(3NF)

????在滿足了2NF之后,繼續分析可以發現,由于關系FIRST1中存在傳遞函數依賴(Sno → Status,Status → City),導致其存在修改操作的不一致性的問題,修改操作的不一致性是指:如Status=20對應的City從天津搬到了上海,則有可能導致一些Status=20的數據被修改,而另一些未被修改,導致數據產生不一致性,為了解決這種問題,就需要3NF

????3NF的目的是消除傳遞函數依賴,也就是說,非主鍵列必須直接依賴于主鍵,而不能依賴于其他非主鍵列。為了使前面的關系達到3NF,我們將FIRST1進一步分解為:

????FIRST11(Sno,Sname,Status)

????FIRST12(Status,City)?

? ??通過上述分解,數據庫模式FIRST轉換為FIRST11(Sno,Sname,Status), FIRST12(Status,City),FIRST2(Sno,Pno,Qty)3個子模式。由于這3個子模式都達到了3NF, 因此分解后的數據庫模式達到了3NF。

4.4. 巴斯-科德范式(BCNF)

? ? BCNF是3NF的一種改進形式,它有三點要求:

  1. 所有非主屬性對每一個碼都是完全函數依賴

  2. 所有的主屬性對每一個不包含它的碼,也是完全函數依賴

  3. 沒有任何屬性完全函數依賴于非碼的任何一組屬性

????簡單來講,就是所有關系的左側都必須能夠定位到唯一的一條數據。例如:存在關系模式如下:

????R(a,b,c,d)

??? F((a,b)→c,(a,c)→d)

????在以上關系模式中,候選鍵為(a,b),由于其中不存在非主鍵列對主鍵的部分依賴,同樣也不存在非逐漸列對主鍵的傳遞依賴,所以它是滿足3NF的,但d對候選碼(a,b)不為完全函數依賴,所以違反了上述3點中的第一點,即不滿足BCNF。為了使之滿足BCNF,我們可以對關系進行拆分:

? ? R1(a,b,c)

????R2(a,c,d)

4.5. 第四范式(4NF)

????????假設存在如下表:

? ? 在該表中,候選鍵為(學生編號,選課,愛好),即全部屬性都是主屬性,且其不存在函數依賴,所以它是滿足BCNF的,但是由于學生編號和選課之間、學生編號和愛好之間分別存在多值依賴,且選課和愛好之間沒有任何關系,所以這里存在數據冗余,每多一個選課都要添加兩條記錄(對應籃球和羽毛球)。4NF的目的就是為了解決這種冗余,即消除關系中的多對多關系,將之拆分成多個1對多關系,例如上述表為了滿足4NF,我們可以將之拆分為如下兩張表:

4.6. 第五范式(5NF)

????在上一小節的例子中,如果補充一點約束:只有愛好為籃球的學生才可以選數學和語文,只有愛好為羽毛球的學生才可以選英語和化學,那么此時由于學生編號、愛好和選課三個屬性之間任意兩個屬性之間都存在多值約束,此時這三個屬性之間就變成了連接依賴,不存在多值依賴,也就自然滿足了4NF,而在4NF的基礎上,進一步消除其不由候選碼隱含的連接依賴,就得到了5NF。所謂“消除其不由候選碼隱含的連接依賴”,就是要保證不存在任何依賴屬性不為候選碼的連接依賴。例如上面所述關系中,其候選碼為(學生編號,選課,愛好),而在其連接依賴中,學生編號→選課和學生編號→愛好之間的連接屬性為學生編號,愛好→選課和學生編號→愛好之間的連接屬性為愛好,愛好→選課和學生編號→選課之間的連接屬性為選課,可見它們的連接屬性均不為候選碼,所以它不滿足5NF。

????為了使上述關系滿足5NF,我們需要針對對其連接依賴進行拆分,將之拆分為R1(學生編號,選課),R2(學生編號,愛好)和R3(選課,愛好)。

4.7. 第六范式(6NF)

????6NF是為了處理時間數據獨立變化的情況而創建的,以避免不必要的重復。其結果是表無法進一步分解;在大多數情況下,表包括主鍵和單個非鍵屬性。如下圖:

????在該關系表中,部門和級別往往是隨著時間獨立變化的,這就導致該表中可能存在大量的重復數據(比如級別不變但部門一直在調整),為了避免這種冗余數據,我們可以將表拆分為如下兩張表,以滿足6NF:

????通過將“時變數據”隔離到自己的表中,與時限屬性相關的操作變得更加高效和清晰。此結構使處理和查詢時態數據變得更加容易。在實踐中,6NF一般僅應用于需要復雜時態數據管理的系統。此外,雖然 6NF 有助于處理時態數據,但它可能會以多個表的形式引入復雜性,這可能需要在查詢期間進行復雜的連接。

五、反規范化

????在關系模式的規范化過程中,會導致關系的概念愈來愈單一化,在響應用戶查詢時,往往需要涉及多表的關聯操作,導致查詢性能下降。為此需要對關系模式進行修正,對部分影響性能的關系模式進行處理,包括分解、合并、增加冗余屬性等。這種修正稱之為反規范化設計,反規范化通過有意地違反數據庫設計中的規范化原則,將數據冗余存儲在多個表中,通過減少表之間的連接來提高查詢性能,從而加快查詢速度。但是,反規范化也會增加數據冗余,增加數據更新和維護的難度。因此,在進行規范化時,需要仔細考慮權衡各種因素,以確保數據的一致性完整性。

????反規范化數據庫不應該與從未進行過標準化的數據庫相混淆。常見的反規范化操作有冗余列、派生列、表重組和表分割,其中表分割又分為水平分割和垂直分割。反規范化會在數據庫中形成數據冗余,為解決數據冗余帶來的數據不一致性問題,設計人員往往需要額外采用數據同步的方法來解決這種數據不一致性。常見的方法有應用程序同步、批量處理同步和觸發器同步等。

5.1. 冗余列

????冗余列是指在一個表中重復存儲相同的信息,以便于快速訪問和提高查詢效率。例如,如果一個訂單表中包含了客戶ID和地址ID,而這些信息又分別存儲在另一個客戶表和地址表中,那么可以在訂單表中直接存儲這些冗余信息,從而避免了多次表連接的需要,提高查詢速度。

5.2. 派生列

????派生列是基于其他列計算得出的列。在反規范化設計中,可以通過添加派生列來存儲計算結果,這樣可以減少對原始數據的查詢次數。例如,如果一個銷售表中需要頻繁計算總金額,可以在該表中添加一個派生列來存儲這個總金額,從而提高查詢效率。

5.3.?表重組

????表重組是指重新組織數據庫中的表結構,使其更適合于特定的查詢需求。這種方法通常涉及到將多個小表合并成一個大表,或者將一個大表拆分成多個小表。這樣做的目的是減少表之間的關系,簡化查詢邏輯,從而提高查詢性能。

5.4.?表分割

????表分割是指將一個大表根據某些條件分割成多個小表。每個小表只包含部分數據,但這些小表共同構成了原來的大表。這種方法可以有效地利用分布式數據庫系統的特性,通過將數據分布到不同的服務器上,可以顯著提高查詢性能和數據處理能力。

5.4.1. 水平分割

????水平分割是根據數據行的特點進行分割,分割之后所得的所有表的結構都相同,而存儲的數據不同。例如我國的身份證號碼若放在一個表中,由于我國人口眾多,因此數據量大,進行身份證查詢時效率低。這時可以按省份對它進行水平分割,把不同區域的身份證號分別存儲在不同的表中,查詢時只需根據省份代碼檢索相應的表,這顯然能提高查詢速度。水平分割會給應用增加復雜度,特別在查詢所有數據需要union(并)操作。在許多數據庫應用中,這種復雜性會超過它帶來的優點,因此,只有當表中數據具有很好獨立性時才適合使用此方法。

5.4.2.?垂直分割

????垂直分割是根據數據列的特點進行分割,分割之后所得的所有表中除了都含有主碼列外其余列都不相同。一般在一個表中某些列常用,而另外一些列不常用的情況下可以采用垂直分割,分割時把操作時常用與不常用的列分別放入不同的表中,這就使得數據行變小,一個數據頁就能存放更多的數據,在查詢時就會減少I/O次數,而且大多數據操作只在少數或者一個表中進行,從而提高系統性能,但其缺點是查詢所有數據時需要join(鏈接)操作。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15584.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是 DNS 轉發?

DNS轉發是一種網絡傳輸技術,主要用于解決本地DNS服務器無法直接解析某個特定域名的情況。當本地DNS服務器收到一個無法解析的域名請求時,它會將該請求轉發給其他可信的DNS服務器,以獲取所需的解析結果。這種技術有助于優化網絡性能和安全性&a…

【Flutter】有狀態組件StatefulWidgetScaffold組件屬性

🔥 本文由 程序喵正在路上 原創,CSDN首發! 💖 系列專欄:Flutter學習 🌠 首發時間:2024年5月26日 🦋 歡迎關注🖱點贊👍收藏🌟留言🐾 目…

AWS聯網和內容分發之VPC

Amazon Virtual Private Cloud(VPC)是一項用于在AWS云中創建一個邏輯隔離的虛擬網絡的服務,使用戶能夠在云中啟動AWS資源(例如EC2實例),并將其放置在自己定義的虛擬網絡中。 Amazon VPC讓您能夠全面地控制…

AEE運行機制深入剖析——閱讀筆記

AEE運行機制深入剖析——閱讀筆記 在移動設備和嵌入式系統的開發中,應用執行環境(Application Execution Environment,簡稱AEE)起著至關重要的作用。AEE是操作系統層面的一個框架,負責管理應用程序的生命周期&#xf…

JVM性能調優:內存模型及垃圾收集算法

JVM內存結構 根據Java虛擬機規范,JVM內存主要劃分為以下區域: 年輕代(New Generation) 包括Eden空間,用于存放新創建的對象。Survivor區由兩個相同大小的Survivor1和Survivor2組成,用于存放經過初次垃圾回…

AI菜鳥向前飛 — LangChain系列之十四 - Agent系列:從現象看機制(上篇)

上一篇介紹了Agent與LangGraph的基礎技能Tool的必知必會 AI菜鳥向前飛 — LangChain系列之十三 - 關于Tool的必知必會 前面已經詳細介紹了Promp、RAG,終于來到Agent系列(別急后面還有LangGraph),大家可以先看下這張圖&#xff1…

leetcode328. 奇偶鏈表,附詳細解析和代碼注釋

leetcode328. 奇偶鏈表 給定單鏈表的頭節點 head ,將所有索引為奇數的節點和索引為偶數的節點分別組合在一起,然后返回重新排序的列表。 第一個節點的索引被認為是 奇數 , 第二個節點的索引為 偶數 ,以此類推。 請注意&#xff0…

Java的反射機制詳解:動態操作類和對象

Java反射是一種強大的機制,允許程序在運行時查詢和操作類、方法、接口等。這種能力使得Java應用可以在運行時動態地創建對象、調用方法和訪問屬性,極大地提升了程序的靈活性和可擴展性。本文將深入探討Java反射的原理、核心API和實際應用場景&#xff0c…

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南 在Flutter框架中,CupertinoSlidingSegmentedControl是一個用于創建類似iOS風格的滑動分段控制器的小部件。這種控制器通常用于允許用戶在不同的視圖或設置之間切換。本文將為您提供一個…

輕量級 K8S 環境 安裝minikube

文章目錄 操作系統DockerDocker CE 鏡像源站使用官方安裝腳本自動安裝 (僅適用于公網環境)安裝校驗Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard參考資料 操作系統 …

Docker進入容器查看內容并從容器里拷貝文件到宿主機

工作中需要從docker正在運行的鏡像中復制文件到宿主機,于是便將這個過程記錄了下來。 (1)查看正在運行的容器 通過以下命令,可以查看正在運行的容器: docker ps (2)進入某個容器執行腳本 我…

前端人員選擇組件封裝

功能&#xff1a; 人員選擇&#xff0c;返回人員參數&#xff0c;以及人員參數id數組支持單選&#xff0c;多選人員支持重新選擇回顯上次選中人員 <!-- 彈窗 --><a-modal v-model"modalVisible" :footer"null" :bodyStyle"{ padding: 0 }&q…

react中子傳父信息

思路是&#xff1a; 在父組件定義一個函數接受參數&#xff0c;接收的參數用于接收子組件的信息&#xff0c;把函數傳給子組件&#xff0c;子組件調用父親傳來的函數并把要告訴父親的話傳到函數中&#xff0c;就實現了子傳父消息 import { useState } from reactimport { use…

OpenWrt 安裝Quagga 支持ospf Bgp等動態路由協議 軟路由實測 系列四

1 Quagga 是一個路由軟件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的實現. 2 web 登錄安裝 #或者ssh登錄安裝 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登錄 #重啟服務 /etc/init.d/quagga restart #…

使用kubesphere部署微服務的時候,節點的鏡像不是最新的導致部署到舊版本問題

我使用kubesphere部署微服務的時候&#xff0c;發現有很多次&#xff0c;我修改了配置文件&#xff0c;但是部署完才發現部署的是舊版本。 然后我查看了該微服務部署在哪個節點上&#xff1a; kubectl get pods --all-namespaces -o wide例如 gulimall-gateway 這個服務&…

韭菜的自我總結

韭菜的自我總結 股市技術面量價關系左側右側右側技術左側技術洗盤 韭菜的自我修養虛擬貨幣的啟示韭菜的買入時機韭菜的心理壓力成為優秀玩家的關鍵 股市技術面 技術面分析可以作為買賣時機判定的工具&#xff0c;但是投資還是需要基本面的分析作為支撐。也就是基本面選股&…

langchain進階一:特殊的chain,輕松實現對話,與數據庫操作,抽取數據,以及基于本地知識庫的問答

特殊的chain langchain中的Chain有很多,能夠輕松實現部分需求,極致簡化代碼,但是實現效果與模型智慧程度有關 會話鏈 效果與LLMChain大致相同 javascript 復制代碼 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…

Spring Boot中如何實現定時任務?

在項目開發中&#xff0c;經常需要編寫定時任務來實現一些功能&#xff1a; 定時備份數據庫、定時發送郵件、定時清理數據、定時提醒或通知、信用卡每月還款提醒 未支付的訂單15分鐘之后自動取消、未確認收貨的訂單7天之后自動確認收貨 定時任務的實現&#xff1a; Spring T…

Redis 實戰 - 緩存異常及解決方案

文章目錄 概述一、緩存穿透1.1 緩存穿透是什么1.2 解決方案 二、緩存擊穿2.1 緩存擊穿是什么2.2 解決方案 三、緩存雪崩3.1 緩存雪崩是什么3.2 解決方案 四、拓展4.1 緩存預熱4.2 緩存降級 五、結語 把今天最好的表現當作明天最新的起點……&#xff0e;&#xff5e; 概述 在實…

YoloV8改進策略:Neck層改進、注意力改進|HCANet全局與局部的注意力模塊CAFM|二次創新|即插即用

yolov9-c summary: 620 layers, 52330674 parameters, 0 gradients, 245.5 GFLOPsClass Images Instances P R mAP50 mAP50-95: 100%|██████████| 15/15 00:06all 230 1412 0.917 0.985 0.99 0.735…