2010-04-26 58 views
0

我希望它的名字是頁面地址。例如,如果頁面標題爲「某些頁面」,則其地址應爲http://somesite/some_page/。 「some_page」 - 系統自動生成的名稱。 「some_page」 - 是頁面的唯一標識符。問題在於將來的用戶可以輸入一個已經存在的會導致錯誤的名字。頁面URL和數據庫組織

有必要爲大量數據找到問題決策的最佳變體。

我已經解決了一個問題,如下所示: 數據庫中的頁面標識符是頁面名稱和默認等於零的後綴。在頁面添加時會檢查是否存在。如果此頁面不存在,則後綴爲0,如果頁面存在,則其名稱爲「some_page」; - 搜索後綴的最大數量,後綴=後綴+1,頁面名稱變爲「some_page_1」。

爲此,我在數據庫中創建域「後綴」的複合鍵和「頁面名稱」:

Table Pages 

suffix|pageName |pageTitle 
0  |some_page |Some Page 
1  |some_page |Some Page 
0  |other_page|Other Page 

加成頁面通過存儲過程中出現:

CREATE PROCEDURE addPage (pageNameVal VARCHAR(100), pageTitleVal VARCHAR(100)) 

BEGIN 

    DECLARE v INT DEFAULT 0; 

    SELECT MAX(suffix) FROM pages WHERE pageName=pageNameVal INTO v; 

    IF v >= 0 THEN 

     SET v = v + 1; 

    ELSE 

     SET v = 0; 

    END IF; 

    INSERT INTO pages (suffix, pageName) VALUES (pageNameVal, v, pageTitleVal); 

END; 

是否有更多的最好的決定?

+1

您是否嘗試過查看.htaccess?你不需要這麼做,以這種方式創建頁面:\ – Tim 2010-04-26 14:48:32

+0

當你選擇數據回來,你怎麼知道你是否需要'some_page_1'或'some_page_2'? – 2010-04-26 14:57:09

+0

公里,如果我需要some_page_2,我會選擇pageName ='some_page'和後綴= 2。 蒂姆,爲什麼? – shurik2533 2010-04-27 05:41:14

回答

1

我認爲這應該沒問題 - 它會保持密鑰的多個實例不同。但是,爲什麼不使用生成的密鑰而不是用戶提供的內容呢?如果您保持對該頁面的查找ID的控制權,您將確保沒有重複項。不過,您目前的設置不應該引起任何麻煩。

唯一的問題是,如果兩個呼叫者試圖同時保存相同的密鑰,您的SP有機會複製某個特定密鑰的後綴 - 即兩個同時發出的請求如果你不關心你的插入語句的結果(並且你的當前SP沒有返回它),那麼只需要在你的SP中的單個語句中執行它:

CREATE PROCEDURE addPage (pageNameVal VARCHAR(100), pageTitleVal VARCHAR(100)) 
BEGIN 

    INSERT INTO pages (pageName, suffix, pageTitle) 
    SELECT n.pageNameVal, ISNULL(NextValue, 0), n.pageTitleVal 
     FROM (SELECT pageNameVal, pageTitleVal) n 
     LEFT 
     JOIN (SELECT MAX(suffix+1) as NextValue FROM pages WHERE pageName=pageNameVal) m 

END