|
|
|
| Здравствуйте, уважаемые знатоки!
Мне необходимо сделать базу в которой будут находиться
статьи разбитые по разделам и подразделам, причем подразделов,
подпод и подподпод итд разделов может быть очень много например:
---------------------------------------------------------------------------
[Раздел] [Подраздел] [Подпод..] [Подподпод..] [..] [..]
---------------------------------------------------------------------------
- Новости
-- О спорте (статья 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]
----------------------------------------------------------
помогите найти оптимальное решение для максимального удобства в использовании
при добавлении, редактировании и удалении разделов и подразделов и статей в них.
заранее спасибо! | |
|
|
|
|
|
|
|
для: kaoz
(25.03.2006 в 20:58)
| | Обычно под статьи заводят одну таблицу, а под параграфы статьи - другую. | |
|
|
|
|
|
|
|
для: cheops
(25.03.2006 в 22:06)
| | Пожалуйста, если можно расскажите поподробнее... | |
|
|
|
|
|
|
|
для: 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;
ну и дальше можно развивать. | |
|
|
|
|
|
|
|
для: des
(25.03.2006 в 23:07)
| | Кажеться Вы не так меня поняли... Хотя может и наоборот =), если что прошу прощения!
Попробуй объяснить еще раз.
Мне нужно создать информационную структуру, которая может выглядеть как на картинке в аттаче. Она может состоять из бесконечно вложенных разделов, в каждом из которых может находиться одна или несколько статей.
Мне необходимо решить задачу таким образом, чтобы было использованно как можно меньше таблиц (в идеале 2) и так чтоб я смог без заморочек управлять этой структурой (добавлять, удалять и модифицировать либой раздел из любого вложения).
В случае со статьями все понятно, структура таблицы будет зависеть от организации таблиц разделов. А вот с этими таблицами разделов не все гладко.
В предложенном мной варианте количество таблиц зависит от степени вложения и возникают сложности в управлении такой структурой (необходимо помнить количество вложений, при создании раздела необходимо добавлять дополнительную информацию во все раньше созданные таблицы, при выводе на экран тоже возникают трудности и т.д.).
Меня интерисует наиболее оптимальная организация таблиц разделов. Если у кого есть соображения, пожалуйста отзовитесь!! | |
|
|
|
|
|
|
|
для: kaoz
(26.03.2006 в 00:03)
| | ... | |
|
|
|
|
|
|
|
для: 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, которое будет указывать какому каталогу принадлежит статья. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2006 в 14:29)
| | т.е. для того чтобы сделать разделы понадобится эта таблица, а для подразделов нужно создать еще одну такую же, а для подподразделов еще одну?
если нет то в чем я ошибся?
для чего нужно поле pos?
заранее благодарен! | |
|
|
|
|
|
|
|
для: kaoz
(26.03.2006 в 16:54)
| | нет, ты ошибся - таблица разделов одна, но позволяет реализовать неограниченную вложенность подразделов:
=====================================
ид_раздела / ид_родительского раздела
1 | 0
2 | 1
3 | 2
4 | 3
5 | 2
6 | 0
==========================
вот структура:
- раздел 1
..... |- подраздел 1(втрой уровень)
............... |- подраздел (третий уровень)
..................... |- подраздел (четвертый уровень)
...... |- подраздел 2 (второй уровень)
- раздел 2 (первый уровень)
Так наглядно?
при обходе структуры удобно использовать итерации.
При этом мне показалось удобным добавить еще пару полей: номер уровня (чтобы не вычислять) и ИД самого верхнего уровня ветки. | |
|
|
|
|
|
|
|
для: denvor
(26.03.2006 в 18:10)
| | ок, большое спасибо за разъяснения...
кстати поле pos предложенное Хеопсом - это номер уровня, насколько я понял.
только вот не понятно зачем ID самого верхнего уровня... | |
|
|
|
|
|
|
|
для: kaoz
(26.03.2006 в 19:07)
| | Нет, pos - это поле для сортировки в пределах одного уровня. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2006 в 20:25)
| | хмм... интересное решение!
осталось выяснить зачем ИД корня...
Может еще у кого есть какие-нибудь соображения? | |
|
|
|
|
|
|
|
для: kaoz
(26.03.2006 в 20:53)
| | На id_catalog ссылается id_parent, если поле id_parent подкаталога имеет значение 3, это означает, что это подкаталог каталога с id_catalog = 3. | |
|
|
|
|
|
|
|
для: cheops
(27.03.2006 в 00:43)
| | это понятно
непонятно что пишет denvor
>При этом мне показалось удобным добавить еще пару полей:
>номер уровня (чтобы не вычислять)
это понятно
>ИД самого верхнего уровня ветки.
это нет | |
|
|
|
|
|
|
|
для: kaoz
(27.03.2006 в 01:38)
| | >>ИД самого верхнего уровня ветки.
>это нет
0, причём записи с таким id_catalog в таблице не должно быть. | |
|
|
|
|
|
|
|
для: cheops
(27.03.2006 в 01:41)
| | зачем для него целое поле создавать?
или я опять чето не понимаю? | |
|
|
|
|
|
|
|
для: 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)
|
| |
|
|
|
|
|
|
|
для: cheops
(26.03.2006 в 14:29)
| | возникает проблема (может это у меня только =)...) как одну и туже статью помещать в разные разделы? (У нее ведь один вторичный ключ сслылающийся на один раздел, а создавать дополнительные поля в процессе управления такой структурой не хотелось бы) | |
|
|
|
|
|
|
|
для: kaoz
(27.03.2006 в 02:37)
| | ок, все понятно...
объяните пожалуйста как создать таблицу для статей, чтобы одну и туже статью можно было бы помещать в разные разделы | |
|
|
|
|
|
|
|
для: kaoz
(27.03.2006 в 14:15)
| | Для этого нужно таблицы разделов и каталогов сделать не зависимыми и добавить третью таблицу, в которой будет указываться соответствие, в какие разделы входит статья. Т.е. она будет указывать пары ключ_раздела-ключ_статьи. | |
|
|
|
|
|
|
|
для: cheops
(27.03.2006 в 17:26)
| | В целом понятно, огромное спасибо!!! | |
|
|
|