Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Поиск оптимального решения
 
 автор: kaoz   (25.03.2006 в 20:58)   письмо автору
 
 

Здравствуйте, уважаемые знатоки!

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

---------------------------------------------------------------------------
[Раздел] [Подраздел] [Подпод..] [Подподпод..] [..] [..]
---------------------------------------------------------------------------
- Новости
-- О спорте (статья 1) .. (статья 4)
--- Хоккей (статья 1) (статья 2)
---- В норвегии (статья 1)
---- В России (...)
--- Футбол (...)
...... (...)
..... (...)
-- О погоде (...)
... (...)
- Информация (...)
... (...)
.... (...)
----------------------------------------------------------
Мое решение такое:

я делаю одну таблицу для статей


[articles]
 id_articles
 header
 text
 div_0  // вторичный ключ указывающий в каком разделе статья 
        // (если равен нулю значит статья в другом разделе.
        // если равен значению искать в таблице div_0 по ключу 
        // id_div_0)
 div_1  // аналогично. только если подразделов не существует 
        // этого ключа тоже нет (т.е. последующие ключи создаются
        // по мере добавления подразделов)
 div_2  // ...
 ..
 div_$x

и шаблон таблиц для разделов и подразделов
[div_$x]
 id_div_$x
 header
 description
 div_$(x+1) // это поле имеет булевое значение если ноль то подразделов у этого раздела нет
                    // если единица то есть...


И генерирую этот шаблон по мере надобности в зависимости от $x значение последнего добавления
которого храню в таблице [variables]
----------------------------------------------------------

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

заранее спасибо!

   
 
 автор: cheops   (25.03.2006 в 22:06)   письмо автору
 
   для: kaoz   (25.03.2006 в 20:58)
 

Обычно под статьи заводят одну таблицу, а под параграфы статьи - другую.

   
 
 автор: kaoz   (25.03.2006 в 22:26)   письмо автору
 
   для: cheops   (25.03.2006 в 22:06)
 

Пожалуйста, если можно расскажите поподробнее...

   
 
 автор: des   (25.03.2006 в 23:07)   письмо автору
 
   для: kaoz   (25.03.2006 в 20:58)
 

название групп статей...
create table a_page (
id_a_page medium mot null auto_increment,
name tynytext not null,
prymary key (id_a_page)
) type = MyIsam;
название статей
тоже создаешь таблицу
create table article (
id_article int not null auto_increment,
......
.....
.....
prymary key(id_article),
key (id_a_page)
)type = MyIsam;

параграфы :
create table paragraf (
id_paragraf int(10) unsigned not null auto_increment,
.....
....
...
id_article int(10) unsigned not null ,
prymary key (id_paragraf),
key id_article( id_article)
)type = MyIsam;

ну и дальше можно развивать.

   
 
 автор: kaoz   (26.03.2006 в 00:03)   письмо автору
 
   для: des   (25.03.2006 в 23:07)
 

Кажеться Вы не так меня поняли... Хотя может и наоборот =), если что прошу прощения!

Попробуй объяснить еще раз.

Мне нужно создать информационную структуру, которая может выглядеть как на картинке в аттаче. Она может состоять из бесконечно вложенных разделов, в каждом из которых может находиться одна или несколько статей.

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

В случае со статьями все понятно, структура таблицы будет зависеть от организации таблиц разделов. А вот с этими таблицами разделов не все гладко.

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

Меня интерисует наиболее оптимальная организация таблиц разделов. Если у кого есть соображения, пожалуйста отзовитесь!!

   
 
 автор: kaoz   (26.03.2006 в 03:14)   письмо автору
 
   для: kaoz   (26.03.2006 в 00:03)
 

...

   
 
 автор: cheops   (26.03.2006 в 14:29)   письмо автору
 
   для: kaoz   (26.03.2006 в 00:03)
 

Вам нужно ввести таблицу под каталоги - которые будут реализовывать бесконечновложенную структуру. Таблица catalog, включает 6 полей:
id_catalog — первичный ключ таблицы;
name — название подкаталога;
descrition — описание подкаталога;
pos — поле, определяющее позицию каталога относительно других при выводе списка каталогов в окне браузера;
hide — поле, типа ENUM, принимающее два значения 'show' и 'hide' и определяющее доступность каталога для просмотра посетителями. По умолчанию, поле принимает значение 'show', что соответствует состоянию доступности каталога для просмотра посетителями;
id_parent — поле, принимающее значение первичного ключа другого каталога, который является родительским для данного подкаталога. Поле id_parent позволяет организовывать многоуровневое вложение каталогов. Значение данного поля равно 0 для каталогов расположенных в корневом каталоге и равно значению первичного ключа каталога по отношению к которому они являются подкаталогами. Оператор CREATE выполняющий создание данной таблицы приведен ниже:
CREATE TABLE catalog ( 
  id_catalog INT(11) NOT NULL AUTO_INCREMENT, 
  name TINYTEXT NOT NULL, 
  description TINYTEXT NOT NULL, 
  pos SMALLINT(3) NOT NULL default '0', 
  hide ENUM('show','hide') NOT NULL DEFAULT 'show', 
  id_parent INT(11) NOT NULL DEFAULT '0', 
  PRIMARY KEY (id_catalog), 
  KEY id_parent (id_parent) 
) TYPE=MyISAM;

А таблица статей должна включать в себя поле для вторичного ключа id_catalog, которое будет указывать какому каталогу принадлежит статья.

   
 
 автор: kaoz   (26.03.2006 в 16:54)   письмо автору
 
   для: cheops   (26.03.2006 в 14:29)
 

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

для чего нужно поле pos?

заранее благодарен!

   
 
 автор: denvor   (26.03.2006 в 18:10)   письмо автору
 
   для: kaoz   (26.03.2006 в 16:54)
 

нет, ты ошибся - таблица разделов одна, но позволяет реализовать неограниченную вложенность подразделов:
=====================================
ид_раздела / ид_родительского раздела
1 | 0
2 | 1
3 | 2
4 | 3
5 | 2
6 | 0
==========================
вот структура:
- раздел 1
..... |- подраздел 1(втрой уровень)
............... |- подраздел (третий уровень)
..................... |- подраздел (четвертый уровень)
...... |- подраздел 2 (второй уровень)
- раздел 2 (первый уровень)

Так наглядно?
при обходе структуры удобно использовать итерации.



При этом мне показалось удобным добавить еще пару полей: номер уровня (чтобы не вычислять) и ИД самого верхнего уровня ветки.

   
 
 автор: kaoz   (26.03.2006 в 19:07)   письмо автору
 
   для: denvor   (26.03.2006 в 18:10)
 

ок, большое спасибо за разъяснения...

кстати поле pos предложенное Хеопсом - это номер уровня, насколько я понял.

только вот не понятно зачем ID самого верхнего уровня...

   
 
 автор: cheops   (26.03.2006 в 20:25)   письмо автору
 
   для: kaoz   (26.03.2006 в 19:07)
 

Нет, pos - это поле для сортировки в пределах одного уровня.

   
 
 автор: kaoz   (26.03.2006 в 20:53)   письмо автору
 
   для: cheops   (26.03.2006 в 20:25)
 

хмм... интересное решение!

осталось выяснить зачем ИД корня...

Может еще у кого есть какие-нибудь соображения?

   
 
 автор: cheops   (27.03.2006 в 00:43)   письмо автору
 
   для: kaoz   (26.03.2006 в 20:53)
 

На id_catalog ссылается id_parent, если поле id_parent подкаталога имеет значение 3, это означает, что это подкаталог каталога с id_catalog = 3.

   
 
 автор: kaoz   (27.03.2006 в 01:38)   письмо автору
 
   для: cheops   (27.03.2006 в 00:43)
 

это понятно

непонятно что пишет denvor
>При этом мне показалось удобным добавить еще пару полей:
>номер уровня (чтобы не вычислять)
это понятно

>ИД самого верхнего уровня ветки.
это нет

   
 
 автор: cheops   (27.03.2006 в 01:41)   письмо автору
 
   для: kaoz   (27.03.2006 в 01:38)
 

>>ИД самого верхнего уровня ветки.
>это нет
0, причём записи с таким id_catalog в таблице не должно быть.

   
 
 автор: kaoz   (27.03.2006 в 02:34)   письмо автору
 
   для: cheops   (27.03.2006 в 01:41)
 

зачем для него целое поле создавать?

или я опять чето не понимаю?

   
 
 автор: cheops   (27.03.2006 в 13:31)   письмо автору
 
   для: kaoz   (27.03.2006 в 02:34)
 

На самом деле без него нельзя, вот как формируется структура подкаталогов
Корень                (id_catalog = 0, id_parent = 0)
 - Корневой каталог 1   (id_catalog = 1, id_parent = 0)
 - Корневой каталог 2   (id_catalog = 2, id_parent = 0)
   -- Подкаталог          (id_catalog = 7, id_parent = 2)
   -- Подкаталог          (id_catalog = 8, id_parent = 2)
   -- Подкаталог          (id_catalog = 9, id_parent = 2)
   -- Подкаталог          (id_catalog = 10, id_parent = 2)
 - Корневой каталог 3   (id_catalog = 3, id_parent = 0)
 - Корневой каталог 4   (id_catalog = 4, id_parent = 0)
 - Корневой каталог 5   (id_catalog = 5, id_parent = 0)
   -- Подкаталог          (id_catalog = 11, id_parent = 5)
   -- Подкаталог          (id_catalog = 12, id_parent = 5)
   -- Подкаталог          (id_catalog = 13, id_parent = 5)
   -- Подкаталог          (id_catalog = 14, id_parent = 5)
 - Корневой каталог 6   (id_catalog = 6, id_parent = 0)

   
 
 автор: kaoz   (27.03.2006 в 02:37)   письмо автору
 
   для: cheops   (26.03.2006 в 14:29)
 

возникает проблема (может это у меня только =)...) как одну и туже статью помещать в разные разделы? (У нее ведь один вторичный ключ сслылающийся на один раздел, а создавать дополнительные поля в процессе управления такой структурой не хотелось бы)

   
 
 автор: kaoz   (27.03.2006 в 14:15)   письмо автору
 
   для: kaoz   (27.03.2006 в 02:37)
 

ок, все понятно...

объяните пожалуйста как создать таблицу для статей, чтобы одну и туже статью можно было бы помещать в разные разделы

   
 
 автор: cheops   (27.03.2006 в 17:26)   письмо автору
 
   для: kaoz   (27.03.2006 в 14:15)
 

Для этого нужно таблицы разделов и каталогов сделать не зависимыми и добавить третью таблицу, в которой будет указываться соответствие, в какие разделы входит статья. Т.е. она будет указывать пары ключ_раздела-ключ_статьи.

   
 
 автор: kaoz   (28.03.2006 в 01:08)   письмо автору
 
   для: cheops   (27.03.2006 в 17:26)
 

В целом понятно, огромное спасибо!!!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования