2010-04-26 56 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