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

que_bunt

Новичок
хочу написать движок для ускореной разработки "стандартных" сайтов, есть вопросы.

здраствуйте.

задача: написать движок, модификация которого при каждой новой разработке стандартного сайта (решения типа "расширеная визитка" - новости, статьи, каталог продукции, текстовые страницы) сводилась бы к минумуму.
а также устранить постоянную нужду лазить и изменять в класах функции добавления/удаления (Insert&Update) например позиций каталога при смене характеристки позиций. Тоесть например(упрощенно) для каждой позиции есть характеристики: высота и ширина, а в новом проекте добавился вес, соответственно надо идти добавить поле в структуру таблицы items, потом надо лезть в класс, менять у всех функциях все INSERT&UPDATE, добавить в формы поля для ввода этих даных, добавить в контроллер проверку на это поле, добавить это поле в шаблоне вывода, вот такую процедуру хотелось бы минимизировать.

интересует именно правильно ли я продумал структуру приложения и бд.
и выдержит ли такая структура нагрузку например 100 000 хитов в день при 50 000 позиций каталога в базе.

итак:
главная таблица
pages:
id
type - тип страницы (staticcontent, dir, catalog_root, catalog_branch, catalog_root_branch)
name - название страницы
nice_name - название для ЧПУ
parent_id - родитель
path - путь ЧПУ
title - тег title на странице
sort_order - позиция при выводе.

при заходе на страницу в front-end наши действия:
1) получаем информ. о странице по ее пути
2) в зависимости от типа страницы выдаем контент:

детальнее пункт 2:
2.1) если type=staticcontent, то просто берем контент из таблицы
staticcontent:
id
page_id
content (longtext)

2.2) если type=dir то выводим список подстраниц (шаблон вывода это уже мелочи)

2.3) если type=catalog_root, то выводим все категории каталога.

2.4) если type=catalog_branch, то выводим все позиции этой категории информацию (характеристики) для которых мы берем из таблиц:
items
id
item_class_id - тип позиции (если есть разные типы - фотоапараты и холодильники - хар-ки разные ведь)
cat_id - категория,=id с таблицы pages
name - название
nice_name - название для ЧПУ
path - путь для ЧПУ
user_id - ид юзера который добавил товар в базу
add_datetime - дата добавления
edit_datetime - дата последнего редактир.
sort_order - позиция в выводе.

и

itemdbelements
id
formelement_name - название характеристики
formelement_value - значение хар-ки
item_id - id позиции с табл. items


2.5) если type=catalog_branch и задана конкретная позиция - воводим информацию об этой позиции, беря информацию из тех же двух таблиц items и itemdbelements.

2.6) catalog_root_branch - тип страницы обьединивший catalog_root и catalog_branch, тоесть тот же каталог, только без подкатегорий, одноуровневый.


по сути получаеться что например те же простенькие новости (или статьи) это и есть в моей структуре catalog_root_branch, раздел с позициями с одной характеристикой (полем для заполнения при добавлении позиции) "текст".
фотогалерея с подразделами - получаеться catalog_root с позициями с характеристиками: подпись, большой рисунок, маленький рисунок.

теперь если к хар-кам позиции каталога (ширина и высота) добавить вес то уже не надо будет идти и менять структуру таблици.


теперь как создаеться форма добавления\редактирования:
есть таблицы
itemclasses - типы позиций
id
name - название типа (фотоапарат, холодильник)
sort_order

formelements - поля различных форм добавления\редактирования.
id
type - типа поля(text, textarea, select, price)
name - название
caption - подпись к полю при заполнении
default_value - значение по умолчанию
field_elements - возможные значении поля (например для select)
size - размер поля
maxlength - максимальная длина
require - обьязательность при заполнении
hint - подсказка при заполнении
searchable - будет ли производиться поиск по полю
search_type - тип поиска по полю (FullText, Like, == и тд.)
sort_order - позиция при выводе формы

class_formelement - какие поля в формах добавления\редактирования к каким типам позиций.
(многие ко многим: formelements<->itemclasses)
id
item_class_id - тип позиций
formelement_id - поле формы


Соответственно при добавлен.\редактиров. создаем форму так:
- выбираем тип добавляемой позиции.
- берем все поля форм из formelements для типа добавляемой позиции (item_class).
- рендерим форму
- если заполнена валидуем форму
- стандартные поля пишем в items
- дополнительные в itemdbelements.

вроде все не очень сложно.


видимые мной возможные проблемы:
1) есть запись позиции, есть стандартние поля:
например 3: категория, название, дата добавления
есть другорятные 7: краткое описание, полное описание, контактное лицо, телефон, e-mail, сайт, адрес.
есть ли большая разница?
1 таблица: 10 столбцов
или
2 таблицы: 3 столбца и 2 столбца по 7 записей?
по сути в два раза большый обьем бд получаеться =(
2) вытекает из первой проблемы:
выборку позиции надо делать:
PHP:
$sql="SELECT * FROM ".ITEMS_TABLE." WHERE path='".$this->safe_data($path)."'";
$result=mysql_query($sql) or $this->error(mysql_error());
$item=mysql_fetch_assoc($result);
//для позиции выбираем dbelements
$sql="SELECT * FROM ".ITEMDBELEMENTS_TABLE." WHERE item_id='".$item['id']."'";
$result=mysql_query($sql) or $this->error(mysql_error());
while($row=mysql_fetch_assoc($result)) {
$item[$row['formelement_name']]=$row['formelement_value'];}
что наверное будет медленней при больших нагрузках чем:
PHP:
$sql="SELECT * FROM ".ITEMS_TABLE." WHERE path='".$this->safe_data($path)."'";
$result=mysql_query($sql) or $this->error(mysql_error());
$item=mysql_fetch_assoc($result);
а если надо выбрать все позиции какой-то категории, то вообще получаем что количество запросов к бд возрастает по геометричной прогресси 1 запрос для выбора всех позиций категории из ITEMS_TABLE + для каждой позиции по запросу на выборку характеристик из ITEMDBELEMENTS_TABLE.

как вы думаете есть ли смысл в такой структуре построения движка? правильно ли я хоть какую-то часть спроектировал? или это все бред?
и реальны ли те проблемы которые я вижу?
возможно есть еще масса других проблем которые я из-за неопытности не вижу?

реальна ли для такой структуры нормальная нагрузка в тех же например 100 000 хитов (при количестве в 50 000 позиций в каталоге + по 50-15 характеристик для каждой позиции в таблице ITEMDBELEMENTS_TABLE в день (цыфри примерные, скорее максимально возможные для меня, но все же)?
если нет то сколько навскидку она вообще выдержит?

-~{}~ 19.12.06 19:23:

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

Marquis

Новичок
Что тебе мешает для начала нарисовать "стандартное решение" подходящее под основные требования
сайта (решения типа "расширеная визитка" - новости, статьи, каталог продукции, текстовые страницы)
И с развитием системы совершенствовать функционал.

Темболее начиная писать
движок, модификация которого при каждой новой разработке стандартного сайта (решения типа "расширеная визитка" - новости, статьи, каталог продукции, текстовые страницы) сводилась бы к минумуму.
нужно думать совсем над другими вопросами.

ыдержит ли такая структура нагрузку например 100 000 хитов в день при 50 000 позиций каталога в базе
До этого дойдешь еще не скоро, не забивай голову бессмысленной оптимизацией.
 

Vallar_ultra

Любитель выпить :)
2que_bunt

И не лень же тебе это писать было :)

А по сути: я как-то не понял сути реализации идеи.... Шаблонным ли будет движок, и если да - то что планируешь использовать?
Какова объектная стр-ра тоже не совсем понятна.... Может проще организовать модульную стр-ру.... Т.е. ты регистрируешь в системе некий модуль, например новости, у страницы новости ты ставишь модуль=news, а уже внутри модуля храняться объекты своей стр-ры. так-же предусмотри возможность вызова объекта из вне(
это например на главной как показать последние 5 новостей, что кстати рекомендую делать сквозь шаблоны...
), и тогда все form-дизайнеры и прочие вещи уйдут в модули, которыми уже можно распоряжаться как угодно.....
 

hermit_refined

Отшельник
вы не в том направлении идете, совсем не в том. в частности, создание "универсальных таблиц" - это путь в никуда.
вы форум читаете? вот только что целых две новостных темы обновились -
http://phpclub.ru/talk/showthread.php?s=&threadid=94464&rand=16
http://phpclub.ru/talk/showthread.php?s=&threadid=79194
почитайте исходники, почитайте что-нибудь умное по j2ee patterns и т.д., со временем придет понимание (не обязательно схожее с чьим-то) как сочетать универсальность, гибкость и эффективность.
 

Vallar_ultra

Любитель выпить :)
2hermit_refined
Я так понял что человек без большого опыта построения систем.... т.ч. тут и "путь в никуда" вполне сгодиться.
Ну а если писать действительно НАСТОЯЩИЙ продукт, а не очередную поделку: то тогда надо много читать про programming patterns, OOP, рефакторинг, а главное UML и ПРИНЦИПЫ ПОСТРОЕНИЯ ИНФОРМАЦИОННЫХ СИСТЕМ и ПОСТАНОВКИ ЗАДАЧИ. Это очень долгий и очень трудоёмкий процесс даже для не очень сложных систем.
 

hermit_refined

Отшельник
в общем, да - три книги, обязательные к прочтению:
http://www.books.ru/shop/books/352130
http://www.books.ru/shop/books/30436
http://www.books.ru/shop/books/156126
мне очень жаль, например, что пять лет назад ничего подобного практически не было, и я проделал достаточно сложный путь через изобретение n-ого количества кривых велосипедов.
 

Vallar_ultra

Любитель выпить :)
2hermit_refined
Зато ты НА ПРАКТИКЕ знаешь множество способов собрать кривой велосипед, что позволяет тебе понимать суть проектирования, а не просто делать так потому что так написано. хотя лит-ра - это важное подспорье в изучении всего.
 

Marquis

Новичок
hermit_refined
imho для начала читать 3 книгу, а потом думать думать и еще раз думать. Но для начала даже эта книга может оказаться очень сложной и как всегда дело закончится чтением книг типо "php для чайников" и "php за 24 часа" и иже с ними :)

[offtop]
предлагаю объединить эту тему и эту
всеравно все закончится очередным холи варом. :)
[/offtop]
 

Vallar_ultra

Любитель выпить :)
2Marquis

ИМХО, всё-таки лучше 1-3-2, т.к. без ХОРОШЕГО ЗНАНИЯ приёмов ООП что-нить понять в 3-ей книге будет проблематично.... Очень часто там надо думать и понимать на уровне объектов.
 

mak_sim2001

Новичок
[offtop]
Тружусь над одним сайтом(не первый месяц) четыре програмиста 1 с пакистана 2 с канады и я с Одессы, сайт начинали делать явно другие люди, полностью было все построено на ООП, а сейчас полный разброд и порядок навести нереально, пакистан постояно лажает и всем работу портит, один с канады переделал еще до меня половину классов и щас все пишет (вылетело это слово) короче без использования ООП, четвертый типа дизанер рисует только рисунки html -ем не напрянается. Свой уровень оценю как невысокий(я вообще тоько 4 месяца c PHP), а меня ещё и просят постоянно дыры латать(костыли ставить), думают я самый умный. Боюсь проект умрет, не родившись, вот сейчас я понял что без ООП нельзя ниче большого создать и надежного, а еще так что-бы несолько человек могло работать. А ещё документацию надо вести, все меня подрывает uml модель нарисовать, того что было и то что новые навояли переписатьб но блин за это никто незаплатит, а только наезжать начнут чем ты занимаешься на что время тратишь.
Результат оценивается по внешнему виду, что там за код(и количество ошибок) никого неволнует :( мне страшно представляю как неповезёт тем кто после нас заглянет. Да и опыт у меня =( я месяц назад о ООП только слышал первый раз
[/offtop]

hermit спасибо за ссылки с книгами,
 

Solid

Drosera anglica
mak_sim2001
Вам проще, судя по количеству проблем, просто всё снести и начать всё с планирования. Да именно, с самого начала. Нарисовать план, и не в голове, а чётко и понятно в диаграммах, так же расписать всё и разложить всё по полочкам. Думаю, что на это уйдёт не более, чем один день. Дальше можно приступить к кодированию, хотя я бы из такого "коллектива" бы бежал. Честно говорю. Так сайты не разрабатываются, тем более в команде. Когда идёт недопонимание между всеми участниками проекта, это, в конечном итоге, всё обязательно выльется в незавершённый проект, а, может быть, и ещё чего хуже.
Что вас ещё может спасти, так это взять инициативу в свои руки, и начать рулить на лево и на право, ибо по другому, в вашем случае, конечная станция будет -- гибель всего проекта. Конечно, вы можете сказать: что за это вам никто и ничего не заплатит, а так же, вы можете возразить, что участники команды будут на вас активно лаять как бешенные псы. Да, возможно будут, но всё же я бы постарался им вдолбить, что так -- НАДО. Тем более этот опыт, даже если вы за него получите небольшие деньги, то он вам, определённо, в будущем поможет, да ещё и не раз.
Возможно, многие могут мне возразить, что подобные эксперименты ставить в середине проекта не стоит, а лучше дождаться конца проекта и уже тогда, как говориться, с чистой совестью начать всё это выполнять. Но я всё же ещё раз выскажусь - вам же будет легче, да и опыт вы получите, так сказать, преждевременно. Главное мотивация, желание и всё что с этим связанно, ибо это жизнь.
 

Vallar_ultra

Любитель выпить :)
2Solid
Это всё хорошо - но только в том случае если проект этого стоит. ИМХО.
 

Vladson

Сильнобухер
Автор оригинала: Solid
Вам проще, судя по количеству проблем, просто всё снести и начать всё с планирования. Да именно, с самого начала. Нарисовать план, и не в голове, а чётко и понятно в диаграммах, так же расписать всё и разложить всё по полочкам. Думаю, что на это уйдёт не более, чем один день.
Полностью согласен, в результате того что описано сейчас в итоге рождится велосипед хоть и с круглыми колёсами но с чугунной рамой сидением с торчащими наверх гвоздями...
 

que_bunt

Новичок
Что тебе мешает для начала нарисовать "стандартное решение" подходящее под основные требования И с развитием системы совершенствовать функционал.
Marquis больше того функционала что я описал пока не надо, вопрос в том как минимально изменять код если например в катлоге изменились некоторые характеристики позиции.
До этого дойдешь еще не скоро, не забивай голову бессмысленной оптимизацией.
дошол уже, проблема встала как раз при 15 000 позиций в каталоге, у каждой позиции по 7 харатеристик, итого таблица с хар-ками(ITEMDBELEMENTS) становит 105 000 (15000х7), админстраторы грузят что моя база убивает сервер, что сервер виснет при ежедневном запуске REPAIR, хочу вияснить дествительно ли это так. до этого основные каталоги, которые я делал были расчитаны на 100-300 позиций (малый бизнес).

вы не в том направлении идете, совсем не в том. в частности, создание "универсальных таблиц" - это путь в никуда.
hermit_refined у меня закрадивалась эта мысль ;) потому решил спросить на форуме, просто не могу понять почему? и как тогда организовывается такая универсальнсоть как я описал? (хоть на пальцах обьясните пожалуста).

-~{}~ 20.12.06 16:54:

вы форум читаете? вот только что целых две новостных темы обновились -
http://phpclub.ru/talk/showthread.p...464&rand=16
http://phpclub.ru/talk/showthread.p...;threadid=79194
hermit_refined спасибо, посмотрю счас на LIMB, но всеже писать свое хочеться. Вериш, чем больше пишу то что уже могу где-то взять тем больше приходит просветление.

-~{}~ 20.12.06 17:08:

hermit_refined благодарин за ссылки с книгами, еще раз бы уточнил очередь? 3-2-1? или 1-2-3?

Какова объектная стр-ра тоже не совсем понятна....
Vallar_ultra у меня есть два главных обьекта:
page - все страницы, включая категории каталогов и тд.
высываеться в фронт-енд: new Pages($path), путь соответственно уникальный.

и еще один обьект items, используеться если страница - ветка каталога.

есть еще другие классы: для управлением класами позиций, формами.

-~{}~ 20.12.06 17:10:

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

-~{}~ 20.12.06 17:17:

Шаблонным ли будет движок, и если да - то что планируешь использовать?
Vallar_ultra да будет шаблонным, шаблонизатор - php ;)
пока еще не все в шаблонизаторе придумал, поэтому часть хтмл у меня еще находиться в контроллере, но я уже более-менее представляю как его оттуда вынести.

-~{}~ 20.12.06 17:41:

и ПОСТАНОВКИ ЗАДАЧИ
постановка задачи есть: задача такая что если я разработал один сайт, а в торой такой же только в каталоге не двери а холодильники, то затрати на разработку второго сайта хотелось бы уменьшить.
 

С.

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

Фанат

oncle terrible
Команда форума
Моё мнение состоит в том, что все эти "ускорялки" на самом деле только мешают.
Сначала возможностей таких конструкторов сильно не хватает, чтобы учесть различия даже у "стандартных" сайтов. потом добавляется куча настроек, чтобы всех удовлетворить. Потом настройка этой "готовой" системы становится более трудоёмкой, чем написать всё с нуля.

Сам я практический каждый проект пишу с нуля. И признаю только "фреймворк", в значении "набор удобных инструментов и повторно используемого кода".
Ненавижу, когда в проекте используется 10 процентов кода, а остальные 90 болтаются от разных других случаев.

Я вообще сторонник простоты. CMS - это несколько сотен строк кода админки. в которой реализовано дерево разделов и модуль размещения текстов. Всё. Дополнительный функционал, от новостей до форума - пишется отдельными модулями. Отображение пишется руками, под конкретный сайт.
 

que_bunt

Новичок
хм.. интересно. спасибо за мнение.
буду еще думать как же мне все-таки организовать производство.
 
Сверху