2016-07-20 52 views
2

我有一張表,我在那裏存儲用戶上傳的文件。可以有5種不同的文件類型:配置文件圖片,cpr文件,學位文件,視頻文件,背景檢查文件。如何更新MYSQL中的特定行

表結構是這樣的:

file_id, user_id, file_type, file_size, file_name, file_new_name, file_path, file_cat, date_created 

我的問題:

  1. 是這種結構有效,或者我應該創建5個不同的表?
  2. 如果我想更新,讓我們說用戶個人資料圖片行,那麼最好的辦法是什麼? ---我想出了一個解決方案,可能不是最好的 - 我更新了行,其中file_cat = "profile_picture" and user_id=:user_id。這會給系統帶來很多負擔嗎?
  3. 首先當用戶註冊時,他沒有任何文件。我應該在表單中隱藏一個用戶insert into ... VALUES ... on duplicate key update嗎?

在此先感謝您。

+0

不要將文件存儲在數據庫中,將它們存儲在磁盤上。請參考數據庫中文件的位置。 –

+0

關於結構 - 這只是我的意見,但個人資料圖片會經常訪問,所以它可能是一個好主意,讓他們有自己的表。對於它們的查詢返回的速度要比其餘時間的查詢快得多。 – PockeTiger

+0

@KIKOSoftware是的。文件存儲在磁盤上,路徑在DB – raqulka

回答

5

這是三個問題沒有一個。

此結構是否有效或應創建5個不同的表?

一張桌子就夠

好,如果我想更新,讓用戶說資料圖片列,然後 什麼是做到這一點的最好方法是什麼? ---我想出了一個解決方案 ,可能不是最好的 - 我更新file_cat =「profile_picture」和user_id =:user_id行。這會給系統帶來很多負擔嗎?

如果在file_cat,user_id(兩個字段上的複合索引)上有索引,則不適用。如果你想使事情有點精簡,你可以存儲常量,而不是「profile_picture」等如

profile_picture = 1 
cpr = 2 
.... 
background = 6 

這將使表和索引有點小。它可能使查詢稍快。

首先當用戶註冊時,他沒有任何文件。我應該用戶 插入... VALUES ...重複鍵更新與隱藏值 在窗體中?

不需要那個。沒有新用戶的記錄實際上使事情變得更容易。您可以執行COUNT(*) = 0查詢或更好地仍然是EXISTS查詢,而無需獲取行並檢查它們。

更新: 這些EXISTS查詢是真正有用的,當你正在處理的加入或例如子查詢快速找到,如果用戶已經上傳了個人資料PICC

SELECT * from users WHERE exists (SELECT * from pictures where pictures.user_id = users.id) 
+0

謝謝你的解釋先生。 – raqulka

+0

你可以給我一個快速的例子,如果存在查詢? – raqulka

+0

我使用了行數。看起來更多的工作,但它的工作。性能方面,行數和存在是否有區別? – raqulka

1

如果您使用的主鍵正確,然後你的insert ... on duplicate key update ...查詢將爲你做所有事情。

對於您的表格,您需要定義一個主鍵列。在這種情況下,我會說這是你的file_id列。所以,如果你插入,MySQL服務器將檢查你的file_id列是否已經爲該值定義,如果是,它將使用新值更新,否則它會在新的file_id中添加一行新數據。

雖然我應該很容易將其分開,但要創建一個用於創建新行的腳本,另一個用於更新。通常,您會在創建時知道,而不是在應用程序中更新。再次正確使用主鍵可以幫助你解決很多問題。在您的where子句中使用主鍵我確信是最有效的更新方法之一。

https://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

+1

謝謝你的解釋。非常感謝 – raqulka