Жесткое кодирование URL-адресов против вложенного набора или комбинированного в Content System - PullRequest
1 голос
/ 25 сентября 2011

Я собираю базу данных для обработки контента, созданного для сайта, однако, думая о долгосрочной перспективе, я не уверен, что у меня самая лучшая система.

В настоящее время яиспользуя метод маршрутизации для передачи всего через index.php, который .htaccess маршрутизирует следующим образом index.php?route=example/url (пользователь видит http://www.domain.com/example/url)

В настоящее время база данных настроена, как показано ниже:

uid            | title        | content | category
--------------------------------------------------
/              | Home         | aaa     | 1
/example       | Example      | bbb     | 2
/example/url   | Example: URL | ccc     | 2

Хотя я не уверен, что это лучший подход, особенно если бы я хотел переименовать example в something - мне пришлось бы переименовывать каждый URL ...

Так что я тожеПодумал о методе Nested Set (например, http://www.phpclasses.org/package/2547-PHP-Manipulate-database-records-in-hierarchical-trees.html), хотя это просто показало бы множество различных чисел в базе данных, где я мог бы получить доступ ко всему по его узлу. Пример ниже;

node | left | right | name
--------------------------
1    | 1    | 6     | Home
2    | 2    | 5     | Example
3    | 3    | 4     | URL

Затем яможет использовать узел в качестве uid? Но я не уверен, как я мог бы перевести http://www.domain.com/example/url в uid, равный 3 ...

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

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

  • Какое из двух лучше подходит для масштабируемости?
  • Если второе, как перевести URL на узел?
  • Могу ли я как-то объединить оба, чтобы оригиналбаза данных хранит uid в качестве номера узла, затем выполняет какое-то соединение, чтобы сделать uid URL-адресом (как в 1) - затем]

    ^ Я думаю, я бы предпочел это (третье),но точно не знаю, как это сделать в MySQL, с некоторыми другими преимуществами:

    • Я мог бы заменить свою систему категорий на родительский узел - что может быть лучше
    • Я мог бы и тогда теоретическихранить идентификатор узла в системе статистики, а не URL

Если кто-нибудь может дать некоторую помощь / предложения - я был бы благодарен!

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Ну, если вы используете index.php?route=example/url, вы всегда можете сделать что-то вроде этого:

$args = explode( '/', $_GET['route'] );
$args = filter_var_array( $_GET['route'], FILTER_SANITIZE_STRING );

Тогда ваши значения $ args будут:

0 -> example
1 -> url

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

HTH.

0 голосов
/ 25 сентября 2011

Модель с вложенным множеством, вероятно, является хорошим выбором здесь.Это приведет к разметке таблицы, например (id,left,right - это поля, необходимые для модели вложенного набора, остальные содержат соответствующее содержимое):

| id | left | right | uid | title | content | category |

Подробнее о том, как выполнить конкретный запрос, можно здесь .

Однако я не буду выполнять поиск в базе данных, а просто кеш массива:

new array('/' => array('content' => 'aaa', 'category' => 'bbbb'),
          '/example/' => array(),
          .....
);

Этот кеш можно создать очень просто(хотя и дорого) и очень легко запрашивается.

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

...