MySQL 5.5 Дизайн базы данных.Проблема с подходом дружественных URL - PullRequest
1 голос
/ 08 июля 2011

У меня может быть глупый вопрос, но мне нужно его задать: -)

Подход к проектированию базы данных My Friendly URL (furl) достаточно обобщен на следующей диаграмме ( InnoDB при MySQL 5.5 используется)

diagram

Каждый элемент генерирует столько же фоллов, сколько языков доступно на сайте. Таблица furl_redirect представляет путь контроллера для каждого элемента. Я покажу вам пример:

item.id = 1000
item.title = 'Example title'
furl_redirect = 'item/1000'
furl.url = 'en/example-title-1000'
furl.url = 'es/example-title-1000'
furl.url = 'it/example-title-1000'

Когда вы вставляете новый элемент, его furl_redirect и furls также должны быть вставлены. Проблема возникает из-за (необходимого) уникального ограничения в таблице FURL. Как вы видите выше, чтобы получить уникальные URL-адреса, я использую название элемента (оно не обязательно уникально) + идентификатор для создания уникального URL-адреса. Это означает, что порядок вставки строк должен быть следующим:

1. Insert item -- (and get the id of the new item inserted) ERROR!! furl_redirect_id must not be null!!
2. Insert furl_redirect -- (need the item id to create de path)
3. Insert furl -- (need the item id to create de url)

Я бы хотел элегантное решение этой проблемы, но я не могу его получить!

Есть ли способ получить значение next AutoIncrement для таблицы InnoDB? И рекомендуется ли его использовать? Можете ли вы придумать другой способ обеспечения уникальности дружественных URL , который не зависит от идентификатора предметов? Я что-то упустил?

Любое решение приветствуется!

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Вы можете получить автоинкремент в InnoDB, см. здесь .Следует ли вам использовать его или нет, зависит от того, какая пропускная способность вам нужна и чего можно достичь.Любой столбец с автоинкрементом / типом идентификатора, если он используется в качестве первичного ключа, может создать «горячую точку», которая может ограничить производительность.

Другим вариантом будет использование буквенно-цифрового идентификатора, например bit.ly или другого.Сокращения URL.Преимущество этого состоит в том, что вы можете иметь короткие идентификаторы, которые используют базу 36 (a-z + 0-9) вместо базы 10. Почему это важно?Потому что вы можете использовать генератор случайных чисел, чтобы выбрать число из довольно большого домена - 6 символов дают вам 2 миллиарда комбинаций.Вы переводите номер в базу 36, а затем проверяете, назначен ли вам этот номер.Если нет, у вас есть новый идентификатор и вы идете, иначе сгенерируйте новое случайное число.Это помогает избежать горячих точек, если это оказывается необходимым для вашей системы.Автоинкремент проще, и я сначала попробую, чтобы увидеть, работает ли он под ожидаемыми нагрузками.

Вы также можете использовать базовый идентификатор 36 и автоинкремент вместе, чтобы вашURL-адреса короче, что часто имеет смысл.

0 голосов
/ 11 июля 2011

Вы можете рассмотреть другие способы борьбы с вашим проектом. Сначала вы используете «en /» «de /» и т. Д. Для смены языка. Могу я спросить, как это работает в сценарии? Если у вас разные папки для разных языков, ваш скрипт и пользователи должны сильно пострадать. Попробуйте использовать gettext или любой другой метод локализации (зависит от размера вашего проекта).

О дружественных URL. Мой любимый метод - иметь только один дополнительный столбец в таблице элемента. Например:

Table picture
id, path, title, alias, created
Values:
1, uploads/pics/mypicture.jpg, Great holidays, great-holidays, 2011-11-11 11:11:11
2, uploads/pics/anotherpic.jpg, Great holidays, great-holidays-1, 2011-12-12 12:12:12

Теперь в скрипте, вставляя элемент, создайте псевдоним из заголовка, проверьте, существует ли уже псевдоним, и если он есть, вы можете добавить идентификатор, случайное число или счет (в зависимости от того, сколько у вас уже таких же заголовков).

После того, как вы сохраните alais, это очень просто. Пользователь пытается получить доступ

http://www.mywebsite.com/picture/great-holidays

Итак, в вашем скрипте вы просто видите, что пользователь хочет видеть картинку, и картинку с псевдонимом замечательно-праздничных дней. Найди его в БД и покажи.

...