簡體   English   中英

更新多個數據的更好方法

[英]Better approach for updating multiple data

我有這個MySQL表,其中行contact_id對於每個user_id是唯一的。

history:
- hist_id: int(11) auto_increment primary key
- user_id: int(11)
- contact_id: int(11)
- name: varchar(50)
- phone: varchar(30)

服務器將不時收到特定user_id的新聯系人列表,並需要更新此表,插入,刪除或更新與先前信息不同的數據。

例如,當前數據是:

在此輸入圖像描述

所以,服務器收到這些數據:

在此輸入圖像描述

新數據是:

在此輸入圖像描述

如您所見,第一行(John)已更新,第二行(Mary)已刪除,另一行(Jeniffer)已包含在內。

今天我正在做的是刪除具有特定user_id的所有行,並插入新數據。 但是自動增量字段(hist_id)越來越大......

Obs:表有大約8萬條記錄,此更新將每天發生30次或更多次。

我有一些(相關的)問題:

1.在這種情況下,您認為從特定user_id刪除所有記錄並插入更新數據是一種好方法嗎?

2.刪除自動增量區域怎么樣? 我不需要它,但我認為擁有沒有主鍵的表不是一個好主意。

3.或許更好的方法是循環新數據,選擇每個user_id / contact_id來比較要更新的值?

PS。 為了更好的方法,我的意思是最有效的方法

非常感謝你的幫助!

  1. 在這種情況下,您認為從特定user_id刪除所有記錄並插入更新的數據是一種好方法嗎?

簡答題你應該利用' upsert '這個' 插入重復密鑰更新 '的縮寫。 這意味着如果它們的密鑰對已經存在,則使用指定的數據更新指定的列。 然后縮短邏輯並減少增量。 這是一個例子,使用應該起作用的表結構。 這也假設您已將user_id和contact_id字段設置為唯一。

INSERT INTO history (user_id, contact_id, name, phone)
VALUES
    (1, 23, 'James Jr.', '(619)-543-6222')
ON DUPLICATE KEY UPDATE
    name=VALUES(name),
    phone=VALUES(phone);

此查詢應保留contact_id,但會使用新數據覆蓋現有數據。

  1. 如何刪除自動增量字段? 我不需要它,但我認為擁有沒有主鍵的表不是一個好主意。

主鍵不表示自動遞增的值。 我可以將varchar字段作為包含水果和蔬菜名稱的主鍵。 這是針對性能優化的嗎? 可能不是。 有許多情況可能需要自動增量,並且有明確的理由可以避免它。 這一切都取決於您希望如何訪問數據以及這將如何影響未來的擴展。 在您的情況下,我將重新開始表結構並重新考慮您希望如何存儲和訪問數據。 你想多寫邏輯來控制數據, 或者你希望將數據本身自然流出? 你已經制作了一張歷史表,乍一看它的功能更像是混合型的多對一人行橫道。 如果不看剩余的表結構,我不一定會突然說這不是一個好主意。 我可以說的是,我會這樣做有點不同。 我將在下一個問題中更具體地回答這個問題。

  1. 或者更好的方法是循環新數據,選擇每個user_id / contact_id來比較要更新的值?

我會避免循環數據以更新它。 這是SQL的一項工作,它可以很好地完成這項工作。 有時,我們可能會發現自己必須這樣做,要么以特定格式提取數據,要么以某種方式修復數據,但要避免這樣做以插入或更新數據。 它會對性能產生負面影響, 你可能會把自己描繪成一個角落

回到我在你的第二個問題的結尾處所說的話,它將幫助你看到我在說什么。 我將假設user_id是在用戶表中自動遞增的主鍵。 我將在這里做一些猜測 ,並向您展示如何重新設計用戶聯系人電話號碼結構的示例。 以下是我匯總的快速模型,顯示了表之間的外鍵關系。

注意 :列名和整體數據排列可以不同的方式完成,但我很快就這樣做了,為您提供了規范化數據庫結構的一個很好的例子。 所有外鍵都具有結構布局,可以將數據分開,使您能夠在進入和離開系統時控制數據流。 這是我使用MySQL Workbench匯總的數據庫模型的屏幕截圖。

規范化的聯系歷史數據庫示例http://xonos.net/user_contact_history_diagram.png 這是SQL,以便您可以更仔細地查看它。

您會注意到“人員”表是從用戶中提取的,但與聯系人共享數據。 這使您可以將所有“人”存儲在一個地方,將所有“用戶”存儲在另一個地方,將所有“聯系人”存儲在另一個地方。 現在,我們為什么要這樣做? 第一個原因可以在兩種情況下解釋。

1.)假設我們有人,在這個例子中我稱他為“Jim Bean”。 “Jim Bean”適用於公司,因此他是該系統的用戶。 但是,“Jim Bean”恰好擁有一家副業,同時也為公司聯系工作。 因此,他既是系統的聯系人,也是系統的用戶。 在更“平坦的表”環境中,我們將有兩條Jim Bean記錄包含相同的數據,這些數據可能會很快過時或不正確。

2.)讓我們說吉姆做了一些壞事,公司不再想和他做任何事了。 他們不想要任何關於他的記錄 - 好像他從未存在過。 我們所要做的就是從Person表中刪除Jim Bean。 而已。 由於外來關系在更新/刪除時具有“CASCADE” - 這會自動傳播並清除與其相關的其他表。

我強烈建議您對規范化數據結構進行一些閱讀。 一旦我掌握了它,它就節省了我很多時間,我永遠不會回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM