页面URL和数据库组织

时间:2010-04-26 14:45:21

标签: database url

我希望它的名字是页面地址。例如,如果页面标题为“Some Page”,则其地址应为http://somesite/some_page/。 “some_page” - 系统自动生成的名称。 “some_page” - 是页面的唯一标识符。问题是,将来的用户可以输入已存在的名称,该名称将导致错误。

有必要为大量数据找到问题决策的最佳变体。

我解决了以下问题: 数据库中的页面标识符是页面的名称和后缀,默认情况下等于零。在页面添加时,检查是否存在。如果这样的页面不存在,则后缀等于0,如果页面存在,则其名称为“some_page”,而不是 - 搜索后缀的最大数量,后缀=后缀+ 1,页面名称变为“some_page_1”。 / p>

为此,我在数据库中创建了字段“suffix”和“pageName”的复合键:

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 个答案:

答案 0 :(得分:1)

我认为这应该没问题 - 它会使密钥的多个实例保持不同。但是,为什么不使用生成的密钥而不是用户提供的东西?如果您保持对页面查找ID的控制,您将确保没有重复项。但是,您当前的设置不应该造成任何麻烦。

唯一的问题(虽然看起来非常不可能)是,如果两个呼叫者试图同时保存相同的密钥,那么您的SP有机会复制特定密钥的后缀 - 即,两个同时具有相同密钥的请求全新的pagename最终都会尝试使用后缀0.如果你不关心insert语句的结果(并且你当前的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