偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

細(xì)說 MySQL 的三種表關(guān)聯(lián)設(shè)計

數(shù)據(jù)庫
正常兩張表進(jìn)行關(guān)聯(lián),我們可以采用中間表的方式,這是最靈活的方式,它可以直接將兩張表的數(shù)據(jù)根據(jù)某個字段直接關(guān)聯(lián)起來。

一、通過關(guān)聯(lián)表(N-N)

正常兩張表進(jìn)行關(guān)聯(lián),我們可以采用中間表的方式,這是最靈活的方式,它可以直接將兩張表的數(shù)據(jù)根據(jù)某個字段直接關(guān)聯(lián)起來。

下面是一個簡單的例子來解釋這個概念: 假設(shè)我們有兩個表:students(學(xué)生)和 courses(課程)。一個學(xué)生可以選修多門課程,同時一門課程也可以被多個學(xué)生選修。這就是一個典型的多對多關(guān)系。

1.students 表

2.courses 表

為了表示學(xué)生和課程之間的多對多關(guān)系,我們可以使用一個中間表 student_courses:

3.student_courses 表

在這個中間表中,每一行都表示一個學(xué)生和一門課程之間的關(guān)聯(lián)。例如,第一行表示 Alice(學(xué)生ID為1)選修了 Math(課程ID為1)。 通過查詢這個中間表,我們可以輕松地獲取某個學(xué)生選修的所有課程,或者獲取選修了某門課程的所有學(xué)生。 這種使用中間表的方式非常靈活,因為它允許我們輕松地添加、刪除或修改學(xué)生和課程之間的關(guān)聯(lián),而不需要修改原始的 students 或 courses 表。

二、主從設(shè)計(1-N)

除了上面那種方式,還有一種主從設(shè)計,就是一張主表,一張明細(xì)表(或者叫做從表)。

主從設(shè)計或稱為父子表設(shè)計是數(shù)據(jù)庫中常見的另一種表關(guān)聯(lián)方式。在這種設(shè)計中,主表通常存儲主要實體的信息,而明細(xì)表或從表則存儲與主表實體相關(guān)的詳細(xì)或子項信息。這種設(shè)計常用于一對多關(guān)系,即一個主表記錄對應(yīng)多個明細(xì)表記錄。 以下是一個主從設(shè)計的例子:

1.主表:orders(訂單)

order_id

customer_id

order_date

total_amount

1

101

2023-04-01

100.00

2

102

2023-04-02

150.00

2.明細(xì)表:order_items(訂單項)

item_id

order_id

product_id

quantity

unit_price

1

1

1001

2

50.00

2

1

1002

1

20.00

3

2

1003

3

50.00

在這個例子中:

  • orders 表是主表,它存儲了訂單的基本信息,如訂單ID、客戶ID、訂單日期和總金額。
  • order_items 表是明細(xì)表或從表,它存儲了每個訂單的詳細(xì)項,如訂單項ID、所屬的訂單ID、產(chǎn)品ID、數(shù)量和單價。

通過 order_id 字段,order_items 表與 orders 表建立了關(guān)聯(lián)。這樣,我們可以輕松地查詢某個訂單的所有項,或者查詢某個產(chǎn)品的所有訂單項。 主從設(shè)計的優(yōu)點是:

  • 結(jié)構(gòu)清晰:主表和明細(xì)表各司其職,主表存儲總體信息,明細(xì)表存儲詳細(xì)信息。
  • 靈活擴(kuò)展:如果需要添加更多的與主表相關(guān)的詳細(xì)信息,可以在明細(xì)表中添加更多字段,而不會影響主表的結(jié)構(gòu)。
  • 易于維護(hù):由于主表和明細(xì)表是分離的,所以對其中一個表的修改不會影響到另一個表。

需要注意的是,在設(shè)計數(shù)據(jù)庫時,應(yīng)根據(jù)實際業(yè)務(wù)需求和數(shù)據(jù)關(guān)系來選擇合適的表關(guān)聯(lián)方式。有時,可能需要結(jié)合使用中間表、主從設(shè)計或其他設(shè)計模式來滿足復(fù)雜的業(yè)務(wù)需求。

三、關(guān)聯(lián)設(shè)計(1-N)

除了上面說的主從設(shè)計,還有一些情況,就是兩張表并非主從關(guān)系,但是也有一定的邏輯關(guān)聯(lián)性。比如一個手機(jī)生產(chǎn)訂單,我們要根據(jù)這個訂單生成一個多個工單,分為原料采購工單,組裝工單,包裝工單等。這種也是一對多的關(guān)系,但并非主從關(guān)系,針對這種情況,我們需要做關(guān)聯(lián)設(shè)計。

我們可以為手機(jī)訂單表和工單表創(chuàng)建相應(yīng)的數(shù)據(jù)庫表結(jié)構(gòu),并模擬一些基礎(chǔ)數(shù)據(jù)。以下是使用SQL語言創(chuàng)建表和插入數(shù)據(jù)的示例:

  1. 創(chuàng)建手機(jī)訂單表 (phone_orders)
CREATE TABLE phone_orders (  
    sid INT PRIMARY KEY NOT NULL,  
    phone_name VARCHAR(100) NOT NULL,  
    phone_quantity INT NOT NULL  
);
  1. 創(chuàng)建工單表 (work_orders)

CREATE TABLE work_orders (  
    sid INT PRIMARY KEY NOT NULL,  
    sSrcSlaveId INT NOT NULL, -- 源單號,即手機(jī)訂單表的sid  
    dProductPQty INT NOT NULL, -- 產(chǎn)品數(shù)量  
    FOREIGN KEY (sSrcSlaveId) REFERENCES phone_orders(sid) ON DELETE CASCADE  
);

這里,我們?yōu)閣ork_orders表的sSrcSlaveId字段設(shè)置了外鍵約束,以確保它引用的是phone_orders表中存在的sid。使用ON DELETE CASCADE選項意味著當(dāng)刪除一個手機(jī)訂單時,與該訂單相關(guān)聯(lián)的所有工單也會被自動刪除。

3. 模擬基礎(chǔ)數(shù)據(jù)

首先,向手機(jī)訂單表中插入一些數(shù)據(jù):

INSERT INTO phone_orders (sid, phone_name, phone_quantity) VALUES  
(1, 'iPhone 13', 0),  
(2, 'Galaxy S22', 0),  
(3, 'Pixel 6', 0);

然后,向工單表中插入與手機(jī)訂單相關(guān)聯(lián)的數(shù)據(jù):

INSERT INTO work_orders (sid, sSrcSlaveId, dProductPQty) VALUES  
(1, 1, 20), -- 對應(yīng)phone_orders中sid為1的訂單,產(chǎn)品數(shù)量為20  
(2, 1, 30), -- 同一個訂單的另一個工單,產(chǎn)品數(shù)量為30  
(3, 2, 50), -- 對應(yīng)phone_orders中sid為2的訂單,產(chǎn)品數(shù)量為50

這里的sid字段在兩張表中都是唯一的,但在各自的表中可以重復(fù)。對于work_orders表,sSrcSlaveId字段對應(yīng)于phone_orders表的sid,用于表示工單與哪個手機(jī)訂單相關(guān)聯(lián)。 手機(jī)訂單的總數(shù)量為0,我們一般需要在生成工單的時候,去回填訂單表的數(shù)量字段,這是很常見的需求。 嘗試寫sql如下:

update phone_orders A join (
 SELECT sSrcSlaveId,SUM(dProductPQty) dProductPQty from work_orders GROUP BY  sSrcSlaveId
) B on A.sid = B.sSrcSlaveId
set A.phone_quantity = B.dProductPQty
where  A.sid = 1;

基于您提供的SQL更新語句,這條語句的目的是更新phone_orders表中sid為1的記錄,將其phone_quantity字段設(shè)置為與該訂單相關(guān)聯(lián)的所有工單的產(chǎn)品數(shù)量之和。

首先,我們來分析這條SQL語句的各個部分:

4.子查詢:

SELECT sSrcSlaveId, SUM(dProductPQty) dProductPQty 
FROM work_orders 
GROUP BY sSrcSlaveId

這個子查詢從work_orders表中選取sSrcSlaveId(即源單號,對應(yīng)于phone_orders表的sid)和每個源單號對應(yīng)的所有工單的產(chǎn)品數(shù)量之和(通過SUM(dProductPQty)計算)。結(jié)果集包含兩列:sSrcSlaveId和計算后的產(chǎn)品數(shù)量dProductPQty。

5.JOIN操作:

UPDATE phone_orders A 
JOIN (
    ...子查詢...
) B 
ON A.sid = B.sSrcSlaveId

這里使用了JOIN操作來連接phone_orders表(別名為A)和子查詢的結(jié)果集(別名為B)。連接條件是A.sid = B.sSrcSlaveId,即phone_orders表的唯一鍵sid與子查詢結(jié)果集中的sSrcSlaveId相匹配。

6.SET操作:

SET A.phone_quantity = B.dProductPQty

此部分將phone_orders表(別名為A)中的phone_quantity字段更新為子查詢結(jié)果集(別名為B)中對應(yīng)的dProductPQty值。

7.WHERE條件:

WHERE A.sid = 1

這個條件限制了更新的范圍,只更新phone_orders表中sid為1的記錄。

這條SQL語句的作用是:找出所有與phone_orders表中sid為1的訂單相關(guān)聯(lián)的工單,計算這些工單的產(chǎn)品數(shù)量之和,然后將phone_orders表中sid為1的記錄的phone_quantity字段更新為這個總和。

執(zhí)行后得到結(jié)果:

思考題

上面的例子,如果我們換成left join,并且去查詢A.sid = 3會發(fā)生什么?

update phone_orders A left join (
 SELECT sSrcSlaveId,SUM(dProductPQty) dProductPQty from work_orders GROUP BY  sSrcSlaveId
) B on A.sid = B.sSrcSlaveId
set A.phone_quantity = B.dProductPQty
where  A.sid = 3;
責(zé)任編輯:趙寧寧 來源: java小白翻身
相關(guān)推薦

2015-09-14 09:31:44

結(jié)對設(shè)計

2010-11-23 10:11:23

mysql建表亂碼

2022-05-27 11:33:02

前端代碼設(shè)計模式

2017-12-29 08:26:28

存儲引擎MySQL

2024-10-10 10:07:07

2021-08-10 15:44:37

PostgreSQL表分區(qū)分區(qū)表

2011-01-18 15:35:59

jQueryJavaScriptweb

2017-07-03 18:24:39

MySQL數(shù)據(jù)冗余

2010-11-22 17:00:10

MySQL建表語句

2010-09-30 11:20:35

DB2表靜默狀態(tài)

2022-06-16 08:24:59

設(shè)計模式代碼前端

2022-03-15 11:31:17

MySQL日志格式

2010-11-10 13:28:06

SQL Server刪

2010-06-13 16:04:14

MySQL三種安裝方式

2010-10-09 11:36:30

MySQL字符集

2010-09-24 19:18:22

SQL索引

2010-05-11 14:08:50

MySQL數(shù)字類型

2010-05-25 18:50:22

MySQL安裝

2018-03-28 16:10:23

閱讀源碼境界

2013-04-01 09:55:03

OpenStack存儲
點贊
收藏

51CTO技術(shù)棧公眾號