我希望它的名字是页面地址。例如,如果页面标题为“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;
是否有更多最佳决定?
答案 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