2010-04-26 3 views
0

Я хочу, чтобы его имя было адресом страницы. Например, если страница имеет заголовок «Некоторая страница», то ее адрес должен быть http://somesite/some_page/. «some_page» -name, генерируемое системой автоматически. «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

+0

, когда вы выбираете данные назад, как вы узнаете, нужна ли вам 'some_page_1' или' some_page_2' ??? –

+0

KM, если мне нужно some_page_2, я выберу страницуName = 'some_page' AND suffix = 2. Тим, почему? – shurik2533

ответ

1

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

Единственная проблема (хотя кажется маловероятной) заключается в том, что ваш 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 
Смежные вопросы