Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Помогите с сотавлением структуры БД


Автор: Raiser 25.8.2006, 10:13
Здравствуйте. Пишу свой первый проект  smile Есть вот такая страничка со ссылками:
user posted image
Есть два "верхних" раздела: Раздел1 и 2, возможно, необхожимо будет добавлять новые.
В эти разделы помещаются ссылки, как Вы видите, в раздел 1 ссылки помещаются без дополнительной разбивки по подразделам. Но в разделе 2 ссылки разбиваются ещё на подразделы (2).
Теперь по самим ссылкам, каждая описывается так "name", "description" и так же есть ссылки которые оформляются стандартным стилем (задан в CSS) это (1) и есть "спецссылки" (3) которые оформляются особым стилем (соотв. это надо как-то заносить в БД).
И ещё про подразделы разделов - сейчас во 2м подразделы есть, но в 1м нет, но в будущем они соотв. могут понадобится.
Как я себе представляю структуру:
1. есть таблица "divisions" - разделы, туда помещается инфа о разделах с такими полями: Name и DID - номер раздела.
2. Есть таблица "subdivisions" - подразделы разделов smile, как я написал выше подразделов может и не быть совсем. Тут тоже соотв. name - имя, subdid - id подраздела, parentdid - id родительского раздела.
Далее, таблица со ссылками "links" , выглядит так:
name - имя ссылки
descriprion - описание
razdelid - id раздела к которому относится
podrazdelid - подраздел...
style - имя стиля CSS, если ссылка оформляется особо, если это поле пустое - то ссылка оформляется по умолчанию.

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

Автор: skyboy 25.8.2006, 11:21
Raiser, как я понимаю, ссылки представляют собой дерево. А ограничена ли глубина вложенности? Или(потенциально, по крайней мере) у подразделов могут быть ещё подразделы?

Автор: Raiser 25.8.2006, 11:26
Skyboy, нет, у подразделов не может быть ещё подразделов.

Автор: skyboy 25.8.2006, 12:04
ссылка, независимо от уровня вложенности, обладает одними и теми же характеристиками? да?

Автор: Raiser 25.8.2006, 12:25
Да, ссылки обладают одними и теми же характеристиками, и ссылка имеет либо "стандартный" вид, либо "специальный" вид.
Так же ссылка может быть дочерней к разделу, либо дочерней к подразделу раздела.

Автор: skyboy 25.8.2006, 14:55
Raiser, тогда делай единый список. Не разбивай на разные таблицы. С опытом научишься радоваться тому, что можно единообразно работать с разными(по представлению, а не по сути) объектами.
Итак. 
Моё предложение: все объекты сделать одинаковыми и равноправными. Причём, как то,что у тебя сейчас идёт как ссылка, так и заголовки разделов(можно будет без проблем подвесить к ним ссылки в будущем):

nodes:
idNode integer(10) autoinc
text varchar(255)
primary index idNode
Тут мы храним все наши текстовые значения ссылок и названий разделов
__________________
nodes_tree:
idNode integer(10)
idParent integer(10)
primary index idNode, idParent
Тут мы храним наше дерево: предка для каждого узла. Узлы верхнего уровня(твои разделы) имеют предка 0.
Пожалуй, стоит добавить уникальный индекс на поле idNode,  чтоб у узла не могло быть более одного родителя. В данном случае, как я понял,  нужны деревья, а не графы...
__________________
nodes_location:
idNode integer(10)
location varchar(255)
primary index idNode
Тут у нас  URI для тех товарищей, кто у нас ссылкой работает.
__________________
classes
idClass integer(10) autoinc
className varchar(255)
primary index idClass
Список имён CSS-классов наших узлов
__________________
nodes_classes
idNode integer(10)
idClass integer(10)
primary index idNode, idClass
index unique idNode
Тут мы привязываем к каждому узлу свой CSS-класс(каждый класс может быть привязан к нескольким узлам, но узел может иметь одновременно не более одного класса)
__________________
nodes_inline_styles
idNode integer(10)
style varchar(255)
Здесь хранятся "встроенные" стили, задаваемые аттрибутом style.
__________________
Теперь, что вытянуть узел, надо сделать так:
Код

SELECT n.text,nl.location,c.className,nis.style
FROM nodes n
LEFT JOIN nodes_locations nl
ON nl.idNode=n.idNode
LEFT JOIN nodes_classes nc
ON ns.idNode=n.idNode
LEFT JOIN classes c
ON c.idClass=nc.idClass
LEFT JOIN nodes_inline_style nis
ON nis.idNode=n.idNode
WHERE n.idNode=<some id>

Так у тебя для нужного тебе узла будут:
- текстовая строка для представления на странице
- ссылка для перехода
- имя класса
- информация о стиле, которая слишком "уникальна", чтоб применять класс.
Если уверен, что, например, у всех узлов будет указано имя класса, то замени LEFT JOIN nodes_classes на INNER JOIN nodes_classes.
Работать будет в несколько раз быстрее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)