2010-04-04 80 views
3

我有一個包含幾個表的數據庫:文件和用戶。這種關係是多對多的,所以我也有一個名爲users_files_ref的表,它持有上述兩個表的外鍵。我應該如何管理我的多對多關係?

這裏的每個表的模式:

文件 - >的file_id,FILE_NAME

用戶 - > USER_ID,USER_NAME

users_files_ref - > user_file_ref_id,USER_ID,FILE_ID

我使用Codeigniter來構建一個文件宿主應用程序,並且我正在添加使用戶能夠上傳文件的功能。這是我遇到我的問題的地方。

一旦我將文件添加到文件表中,我將需要該新文件的ID來更新users_files_ref表。現在我將記錄添加到文件表中,然後我想象我會運行一個查詢來獲取添加的最後一個文件,以便我可以獲取該ID,然後使用該ID插入新的users_files_ref記錄。

我知道這將在小範圍內工作,但我想有一個更好的方式來管理這些記錄,特別是在交通繁忙的情況下。

我是新來的關係型數據庫的東西,但已經出現了PHP一段時間,所以請我在這裏承擔:-)

我有主鍵和外鍵設置正確的文件,用戶和users_files_ref表,我只是想知道如何管理這種情況下添加文件記錄?

感謝您提供的任何幫助,非常感謝。

-Wes

回答

1

使用$this->db->insert_id()獲取您剛插入的行的ID號。進一步的文檔在這裏:http://codeigniter.com/user_guide/database/helpers.html

+0

夏天,我在查看CI文檔時忽略了這一點,並沒有注意到它實際上抓住了最後一個插入(d'oh!):] 這看起來像是一個完美的解決方案,因爲不需要存儲過程學習,但是我想知道存儲過程是否可以在許多用戶同時上傳的時候更好地管理這些插入的完整性。你有沒有遇到過這種特殊方法的麻煩?感謝您爲我的注意力帶來這個小寶石! – wes 2010-04-04 23:32:45

+0

我敢打賭,Ellis實驗室的人員太好了,無法公開帶有明顯併發問題的數據庫方法。或者,您可以隨時查看源代碼以確保自己的安全。我從來沒有遇到過問題。 :) – Summer 2010-04-06 19:03:42

0

我想你需要的僅僅是這樣的:

    ----primary key----- 
users_files_ref -> | user_id, file_id | 

你如何獲得的file_id的是依賴於你要執行的代碼。你的推理是正確的。你已經有了user_id,只需要獲取file_id。通過這些值,您可以向user_files_ref添加一個新行。

當我需要這樣做時,我通常有一個存儲過程,藉助插入文件的序列,並返回序列NEXTVAL作爲輸出。這可能是實現這種內容的一種方式。

這是一個基於Oracle的存儲過程的代碼:

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE IN FILE.FILE%TYPE, 
              FILE_ID OUT NUMBER) 

IS 

BEGIN 

    SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL; 

    INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE); 

END SP_IMPORT_FILE; 
+0

非常感謝Leniel!它看起來像我可以使用存儲過程爲每個用戶創建一個默認文件夾記錄,因爲它們也被創建,所以這看起來非常有用,我肯定會做一些研究存儲過程。再次感謝分享! – wes 2010-04-04 23:24:10

0

你基本上說明它是如何正常完成,但有一個重要的調整:你如何檢索文件的file_id的能夠將其添加到users_files_ref。

通常在數據庫環境中,您有許多客戶端同時連接,同時進行更新。在這樣的環境中,你不能只獲得最後一個文件的file_id - 它可能是在數據庫調用之間添加的某個elses文件。您必須使用數據庫的功能來獲取生成的ID(例如,MSSQL上的SELECT @@IDENTITY)或以某種方式在應用程序代碼中生成ID。

+0

我認爲現在我會使用存儲過程,如果我可以快速地將我的頭包裹起來,那麼我可以讓數據庫擔心爲我創建ID。如果出現這種情況,我想要適應高流量的情況。下面的海報夏天讓我意識到了PHP中的一個函數,它將獲取最後插入的ID,這對我來說更容易,因爲我不必學習存儲過程。但是我想知道在高流量下是否會出現問題?如果您有任何經驗,我很樂意聽取您可能提供的任何提示。感謝您的輸入Anders! – wes 2010-04-04 23:30:07

相關問題