URL страницы и организация базы данных - PullRequest
0 голосов
/ 26 апреля 2010

Я хочу, чтобы его именем был адрес страницы. Например, если страница имеет заголовок «Некоторая страница», то ее адрес должен быть http://somesite/some_page/. "some_page" - имя, сгенерированное системой автоматически. «some_page» - это уникальный идентификатор страницы. Проблема в том, что пользователь в будущем может ввести имя, которое уже существует, что приведет к ошибке.

Для больших объемов данных необходимо найти оптимальный вариант решения проблемы.

Я решил проблему следующим образом: Идентификатор страницы в базе данных - это имя страницы и суффикс, который по умолчанию равен нулю. При добавлении страницы происходит проверка на существование. Если такой страницы не существует, суффикс будет равен 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 Ответ

1 голос
/ 26 апреля 2010

Я думаю, что все должно быть в порядке - это будет отличать несколько экземпляров ключа. Однако почему бы не использовать сгенерированный ключ вместо того, что предоставлено пользователем? Если вы сохраняете контроль над идентификатором поиска на странице, вы не пропустите дубликаты. Однако ваши текущие настройки не должны вызывать проблем.

Единственная проблема (хотя она кажется маловероятной) заключается в том, что у вашего SP есть возможность дублировать суффикс для определенного ключа, если два вызывающих абонента пытаются сохранить один и тот же ключ одновременно - то есть два одновременных запроса с одинаковым новое имя pagename может в итоге попытаться использовать суффикс 0. Если вас не волнует результат вашего оператора вставки (а ваш текущий 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...