Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Структура таблиц

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите создвать правильную структуру таблиц в БД.
Евгений 777
Отправлено: 31 Марта, 2011 - 02:13:47
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




Доброго времени суток, Уважаемые форумчане. Заранее прошу прощения, если слишком много написал, пытался объяснить всё по порядку, уж как смог. И ещё, заранее прошу пишите пожалуйста более понятными словами, мне тяжко даётся обучение.

У меня на сайте должно быть что типа, как на
рисунке в приложенном файле в самом низу (это меню навигации). Сейчас я
делаю админку и у меня проблема с одной фишкой. На сайте должны быть
категории, под ними должны выводиться страницы (для каждой категории
свои страницы). Но фактически страница может являться разделом, т.е
она может иметь вложения. Например есть категория "Схемы", в ней есть
страница "Принципиальные схемы", в этой странице есть ещё к примеру 2
страницы "Источники питания" и "автомобильные схемы". А для этих
страниц (фактически являющимися разделами) есть статьи, например "Блок
питания", "Зарядное устройство", "Сигнализатор скорости". Все эти вещи
на сайте должны быть реализованы примерно так: В меню навигации есть
категория "Схемы", под этой надписью (это будет просто надписью, не
ссылкой) есть ссылка вида "Принципиальные схемы", при нажатии на
которую в блоке контент должны будут выводиться разделы "Источники
питания" и "автомобильные схемы" (они также будут ссылками). При
нажатии например на ссылку "Источники питания" будут выводиться "Блок
питания", "Зарядное устройство" ну и так далее. Опять же при нажатии
на них будут выводиться уже сами схемы. Это наверное понятно.
Структура моих таблиц также в приложенном файле. Примерно она такова.
"Схемы" имеет id= 1 parent= 0. "Принципиальные схемы" имеет id= 5
parent= 1 (т.е является потомком "Схемы"). Далее "Источники
питания" имеет id= 10 (к примеру) и парент = 5 (является потомком
"Принципиальные схемы"). Далее статья "Блок питания" имеет id= 20 (к
примеру) и парент= 10 (потомок "Источник питания").
Но, проблема в следующем. Например я хочу сделать промежуточную
страницу между "Схемы" и "Принципиальные схемы". Не важно как она
будет называться, пусть к примеру "новая страница" и будет иметь id=
25. Что будет в таком случае. Мне надо будет как то в админке указать
что она относится к категории "Схемы", т.е имеет парент= 1, а
страница "Принципиальные схемы" должна иметь уже парент не 1, а 25.
иначе все файлы просто потеряются. Такая же история если мне
понадобится это вложение "Новая страница" удалить. В этом случае мне
надо как то указать парент для страницы "принципиальные схемы"
соответствующий id какого нибудь другого раздела, чтобы эти статьи не
потерялись. Это думаю тоже понятно, хотя возможно запутано.
В прикреплённом файле я создал макет имеющихся на данное время таблиц
и их связи. Ниже макет переделанной таблицы. Помогите пожалуйста
правильно организовать структуру таблиц чтобы и была простая
возможность перемещения документов из раздела в раздел (по сути просто
изменение парента) и чтобы запросов к базе было по возможности меньше.
К сожалению я как не пытался не получается у меня создать что то более
менее оригинальное. Если я что то не так пытаюсь сделать, поправьте
пожалуйста. Может быть Вы поможете.
Я вроде написал как на сайте всё должно быть взаимосвязано (возможно
Вы свой вариант предложите) и написал в чём конкретно у меня проблема
в админке. По сути только с возможностью перемещения (добалвения,
удаления страниц).
Скачать файл: Id.doc
Скачан раз: 100


-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
Jampire
Отправлено: 31 Марта, 2011 - 15:21:59
Post Id



Гость


Покинул форум
Сообщений всего: 106
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Отдели описание от самого вопроса.
Слишком много накатано )


-----
не будите во мне зверя!!! он и так не высыпается...
 
 Top
Евгений 777
Отправлено: 31 Марта, 2011 - 23:24:33
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




Хорошо, попробую написать покороче, по другому. Есть у меня таблица категории, в ней допустим 5 категорий, т.е получается 5 разных id, одна из категорий называется "Схемы" и имеет id= 3.К этой категории например есть вложенная страница "Принципиальные схемы", она относится к категории 3 (т.е получается имеет парент= 3) и id у неё к примеру= 5. Далее, в таблице со статьями есть 2 статьи относящиеся к этой странице "Принципиальные схемы" и получается имеют парент= 5. Всё просто. НО, надо как то сделать возможность добавления страницы между страницей "Принципиальные схемы" и статьями к ней относящимся. Пусть она будет тупо называться "новая страница". Id ей проставится автоматом, к примеру 10. При добавлении через админку этой страницы я буду выбирать к какой категории (или странице) её отнести (т.е в данном случае поставить эту страницу перед страницей "Принципиальные схемы", либо после неё.) она получается будет относиться к той же самой категории, только будет как бы промежуточной. Ещё раз Улыбка Категория "Схемы"=> страница "Принципиальные схемы"=> статья1, статья 2. После добавления страницы должно быть примерно следующее: Категория "Схемы"=> страница "Принципиальные схемы"=> страница "Новая страница"=> статья1, статья 2. Значит чтобы мне встроить эту новую страницу между какими либо, мне надо этой новой странице указать парент её родителя, а странице которая уже будет после неё поставить парент= id этой новой страницы. Другими словами построить иерархию страниц. Тоже самое и для возможности удаления этой вложенной страницы. Чтобы при удалении этой страницы, всем последующим после неё страницам присвоился парент равный id родителя этой удаляемой страницы.
В приложенном файле я сделал эскиз сперва переделанных таблиц, а внизу документа та таблица которая есть сейчас. Для сравнения, как лучше сделать структуру этих таблиц, чтобы иметь возможность построить иерархию. Говорили что надо делать рекурсивные функции для этого, но к сожалению я не знаю пока как это сделать. Приведу на всякий случай небольшой пример того что мне надо.
id 1 "Схемы" parent 0 (это категория).
id 5 "Принципиальные схемы" parent 1 (это страница)
id 10 "Схема 1" parent 5 (это статья)

Это ДО добавления страницы, а так должно быть ПОСЛЕ
id 1 "Схемы" parent 0 (это категория).
id 5 "Принципиальные схемы" parent 1 (это страница)
id 7 "Новая страница" parent 5
id 10 "Схема 1" parent 7 (это статья)

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


-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
evgenijj
Отправлено: 01 Апреля, 2011 - 01:38:29
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Вот не оратор ты. Ну как можно так запутать вопрос? У тебя есть древовидная структура:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Раздел 1 (родитель 0)
  2.   Раздел 2 (родитель 1)
  3.   Раздел 3 (родитель 1)
  4. Раздел 4 (родитель 0)
  5.   Раздел 5 (родитель 4)
  6.   Раздел 6 (родитель 4)
  7.     Раздел 7 (родитель 6)
  8.     Раздел 8 (родитель 6)
  9. Раздел 9 (родитель 0)
  10.   Раздел 10 (родитель 9)
  11.   Раздел 11 (родитель 9)

Если мы удаляем раздел 6, то надо "подцепить" его потомков к разделу 4. А весь текст, который ты выдал -- никому не нужен. Технология родитель-потомок здесь (почти) всем понятна. А удаление элемента -- только тонкость реализации. Если вдруг при выводе "схемы", "статьи" или "раздела" есть какое-то различие -- никто не мешает ввести в таблицу БД дополнительное поле `type`. Мы все равно выводим некий HTML, который имеет заголовок и контент.

Только "Статья" -- заголовок и текст
а схема -- заголовок и картика

А теперь найдите два отличия

CODE (htmlphp):
скопировать код в буфер обмена
  1. <h2>Заголовок</h2>
  2. <p>Текст, текст, текст</p>


CODE (htmlphp):
скопировать код в буфер обмена
  1. <h2>Заголовок</h2>
  2. <p><img src="..." alt="..." /></p>


В предложенной тобой реализации древовидной структуры есть три типа элементов -- категория, статья, схема. НЕТ МЕЖДУ НИМИ ПРИНЦИПИАЛЬНОГО РАЗЛИЧИЯ. Есть лишь один элемент -- ЭЛЕМЕНТ, который имеет родителя, и может иметь потомка.

(Отредактировано автором: 01 Апреля, 2011 - 01:50:37)

 
 Top
Евгений 777
Отправлено: 01 Апреля, 2011 - 01:51:30
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




Сразу видно грамотный человек Улыбка , написал в 2-х строчках то что я писал на страницу. Поле тип кстати сейчас есть у меня в таблице. Один знакомый программист сказал что оно не нужное, вот я и стал ломать голову как что переделать, т.к он объяснять ничего не стал. Сейчас у меня в одной таблице и категории и разделы. Поле тип имеет значение 0 для категорий, значение 1- для страниц, 2- для разделов. А вообще конечно страница от раздела ничем не отличается, так что надо всё же табличку переделать. Но, собственно вопрос не столько в том как будут устроены таблицы, вопрос больше о том, как написать такой скрипт, который бы при добавлении нового раздела вычислял те разделы которые будут после него и присваивал им парент добавляемого раздела. Тоже самое и для удаления раздела. Я возможно не туда написал, надо бы в форум по PHP, но т.к был вопрос и с таблицами, то решил здесь его задать. Со скриптом можете помочь?


-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
evgenijj
Отправлено: 01 Апреля, 2011 - 02:11:21
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Евгений 777 пишет:
Но, собственно вопрос не столько в том как будут устроены таблицы, вопрос больше о том, как написать такой скрипт, который бы при добавлении нового раздела вычислял те разделы которые будут после него и присваивал им парент добавляемого раздела.

Ты вознамерился написать систему искусственного интеллекта? Снимаю шляпу... Если нет -- пишем просто и незатейливо
CODE (html):
скопировать код в буфер обмена
  1. <form action="someaction.php" method="POST">
  2. <select name="category">
  3.   <option name="1">Первый</option>
  4.   <option name="2">Второй</option>
  5.   <option name="3">Третий</option>
  6. </select>
  7. <input name="name" value="" />
  8. <input type="submit" valie="Отправить" />
  9. </form>

Дай возможность пользователю выбрать родителя. Пусть это будет запрос
SELECT * FROM elements WHERE 1 ORDER BY id

(Отредактировано автором: 01 Апреля, 2011 - 02:12:15)

 
 Top
Евгений 777
Отправлено: 01 Апреля, 2011 - 02:26:20
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




evgenijj пишет:

1 Раздел 1 (родитель 0)
2 Раздел 2 (родитель 1)
3 Раздел 3 (родитель 1)


извините, но при чём здесь форма? Я говорю про скрипт.
Если я добавлю например Раздел 4 как промежуточный, между разделом 1 и разделом 2 например. Т.е. уже получится примерно так
CODE (html):
скопировать код в буфер обмена
  1. Раздел 1 (родитель 0)
  2.  Раздел 2 (родитель 1)
  3.  Раздел 3 (родитель 1)
  4.  Раздел 4 (родитель 1)

То это получится не промежуточный раздел а параллельный. Мне надо чтобы Раздел 2 например был ПОСЛЕ раздела 4. Т.е. что то типа
CODE (html):
скопировать код в буфер обмена
  1.  Раздел 1 (родитель 0)
  2.  Раздел 2 (родитель 4)
  3.  Раздел 3 (родитель 1)
  4.  Раздел 4 (родитель 1)

Как для этого сделать скрипт который бы мог вставить новый раздел МЕЖДУ двумя прежними, каким образом он должен поменять у Раздела 2 родителя с 1 на 4. Тоже самое и при удалении этого раздела 4, скрипт должен у раздела 2 поставить родителя с 4 на 1. Я же про это пытаюсь узнать. Видно надо писать какую то рекурсивную функцию для проверки всех родителей и подставляла бы значения. Это можно сделать, или нет?
evgenijj пишет:
Если мы удаляем раздел 6, то надо "подцепить" его потомков к разделу 4.


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

(Отредактировано автором: 01 Апреля, 2011 - 02:35:14)



-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
evgenijj
Отправлено: 01 Апреля, 2011 - 02:35:19
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Не читаешь ответ. Хорошо, дай минут 10 -- напишу.
(Добавление)
Ну так, навскидку...
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $query = "SELECT id, title FROM items WHERE 1 ORDER BY sortorder";
  3. $res = mysql_query( $query );
  4. echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
  5. echo '<select name="parent">';
  6. echo '<option value="0">Корень</option>';
  7. while ( $item = mysql_fetch_array( $res ) ) {
  8.   echo '<option value="'.$item['id'].'">'.$item['title'].'</option>';
  9. }
  10. echo '</select>';
  11. echo '<input type="text" name="title" value="" />';
  12. echo '<input type="submit" name="Добавить" value="" />';
  13. echo '</form>';
  14.  
  15. if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) ) {
  16.   // Добавляем новый элемент в конец
  17.   $query = "SELECT MAX(sortorder) FROM items WHERE parent=".$_POST_['parent'];
  18.   $res = mysql_query( $query );
  19.   $max = mysql_result( $res, 0, 0 ) + 1;
  20.   $query = "INSERT INTO (id, title, parent, sortorder) VALUES (NULL, '".$_POST['title']."', ".$_POST['parent'].", ".$max.")";
  21. }
  22. ?>


Если есть проблемы, как сдвинуть элемент вверх-вниз -- пиши.

(Отредактировано автором: 01 Апреля, 2011 - 03:35:32)

 
 Top
Евгений 777
Отправлено: 01 Апреля, 2011 - 03:27:26
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




Хорошо, спасибо, напишу если что. Буду разбираться что к чему. К сожалению не могу сказать "спасибо" через форум. Мало сообщений.


-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
evgenijj
Отправлено: 01 Апреля, 2011 - 03:31:32
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Евгений 777 пишет:
К сожалению не могу сказать "спасибо" через форум

Принято Улыбка, спасибо на добром слове. Дам еще один добрый совет: выполни задание от А до Я -- многое станет понятно. Как писать админку, как ее редактировать
http://blog[dot]webmasterschool[dot]ru/mysql/9/
В твоем случае -- еще одно поле <select> для выбора родителя

(Отредактировано автором: 01 Апреля, 2011 - 03:52:26)

 
 Top
Евгений 777
Отправлено: 01 Апреля, 2011 - 13:05:31
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




Про админку я почитал, я примерно так всё и делаю, только у меня немного больше файлов, т.к. я делаю по типу MVC. У меня есть пара вопросов, если можно, по Вашему коду. Мне не совсем понятен принцип его работы. Вот к примеру строка
evgenijj пишет:
WHERE 1 ORDER BY sortorder

Для чего указано WHERE 1, если выбираем из таблицы все записи, то можно ведь и ничего не указывать (возможно я не прав, SQL я слабо знаю) и не понятно sortorder, это я так понимаю я должен создать в таблице такое поле, которое будет упорядочивать записи. В таком случае если у меня страница "Принципиальные схемы" имеет парент 1 и этот sortorder например будет 1, то новая страница создастся с sortorder 2 и что это даст, ведь не факт что создаётся вложенная страница именно к этому разделу. Ну выберу я через селект категорию "Категория 1" у этой страницы будет парент 0 ну и дальше что? Как мне указать что я хочу сделать ВЛОЖЕННУЮ страницу МЕЖДУ например "КАТЕГОРИЯ 1" и "СХЕМЫ УСТРОЙСТВ". ? Или я не догоняю чего то, или мы не понимаем друг друга Растерялся
Вот ЭТО как осуществить? Чтобы если страница встраивается МЕЖДУ уже существующими страницами, то как указать это тем страницам (потомкам), что они должны ссылаться уже не на ту страницу что раньше а на новую, т.е иметь уже другой парент. Это же надо найти этих потомков, узнать id добавляемой страницы и указать его в качестве парента этим потомкам. Тоже самое и при удалении страницы, надо узнать парент удаляемой страницы и указать этот парент потомкам. Чтобы не нарушалась последовательность страниц. Я не знаю уже как объяснить.

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

(Отредактировано автором: 01 Апреля, 2011 - 13:59:42)



-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
Евгений 777
Отправлено: 02 Апреля, 2011 - 19:18:10
Post Id



Гость


Покинул форум
Сообщений всего: 81
Дата рег-ции: Июль 2010  
Откуда: Мурманск


Помог: 0 раз(а)




evgenijj,
Как и говорил, отписываюсь Улыбка .
В общем сделал я возможность перемещения всех вложенных файлов в любом направлении и по любым дирректориям. Теперь можно менять вложенные страницы как угодно. Я создал модуль который проверяет есть ли в обеих таблицах записи имеющие парент= id изменяего документа и если они есть, он выводит их названия и предлагаются радиокнопки с действиями "оставить как есть", "перенести (в селекте все страницы для выбора перемещения)" и "удалить". Теперь я могу делать с ними всё что хочу. Улыбка
Правда код получился немного трудноватый для чтения, но работает. Причём этот модуль можно подключать не только при изменении размещения файла, а при его удалении тоже. Теперь если удалить какую то промежуточную страницу, то вложения никуда не потеряются. Если есть желание посмотреть, могу скинуть файлы Вам на почту. Вот осталось единственное, надо на JS сделать выпадащий список (селект), если выбрана радиокнопка "переместить", то чтобы только в этом случае появлялся селект со всеми страницами. Если же выбрана другая радиокнопка, то этот селект появляться не должен.


-----
Написать код не проблема. Написать правильный код- это наука.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB