Выборка записей с слагом вместо ID - PullRequest
5 голосов
/ 27 января 2009

В настоящее время я пытаюсь найти лучший способ (с точки зрения удобства использования и производительности) при работе с такой ситуацией, как выборка записей, помеченных определенным тегом, категорией или чем-то подобным.

Хороший способ (так, как я хотел), - это выборка записей с помощью тега / категории, чтобы URL выглядел так:

http://stackoverflow.com/questions/tagged/language-agnostic

извлечение записей слагом, который выглядит лучше, чем:

http://stackoverflow.com/questions/tag/789/language-agnostic

выборка по идентификатору и добавление слага, что делает его более удобным для поисковых систем. Это лучше с точки зрения производительности, потому что выборка данных по целочисленному идентификатору будет быстрее, чем строка. (Cmiiw)

Теперь со схемой БД, например:

posts    post_to_tags    tags
-----    ------------    ----
id       id              id
title    post_id         name
content  tag_id          slug
...                      ...

я правильно делаю? Есть ли подводные камни или лучшие практики, которые мне нужно знать, чтобы избежать проблем с производительностью? (например, теги не должны превышать 10000 записей, или тег тега не должен превышать n символов или что-то еще)

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 27 января 2009

С первым стилем URL и вашим текущим дизайном БД вы можете сделать это:

select ...
from   posts p
join   posts_to_tags pt on pt.post_id = p.post_id
join   tags t on t.id = pt.tag_id
where  t.slug = [url slug value];

До тех пор, пока tags.slug проиндексирован, это должно быть очень эффективно, вряд ли отличается от

select ...
from   posts p
join   posts_to_tags pt on pt.post_id = p.post_id
where  pt.tag_id = [url tag ID];
0 голосов
/ 27 ноября 2009

Первый лучше, но можно ли заменить слизняков? В этом случае вам потребуется таблица перенаправления (например, «some-article-about-dogs» теперь называется «article-about-dogs-and-cats»).

...