Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

динамическая генерация таблиц в БД

333
11 апреля 2008 года
GHopper
200 / / 28.12.2004
Здравствуйте!
Сталкнулся с такой задачей - нужна база товаров. Представляю себе это так:
есть дерево рубрик (недвижимость, автомобили, мобильные уст-ва и др.) и в каждой из этих рубрик будут товары со своими свойствами. Например для недвижимости - квартира может быть 1 комнатная, 2-х, 3-х, ..., первый этах, второй, ..., адрес, прощадь и др. Для автомобиля это цвет кузова, пробег, привод, производитель, топливо и др. Для мобильных устройств свои свойства.

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

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

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

Короче в голове бардак! Хочу выслушать ваш профессиональный подход к данной задаче. http://market.ngs.ru/ - проект, клон которого мне нужно написать. Там у каждого товара свои свойства. Как им это удалось? Как сделать, чтобы ребрики добавлялись обычным Модератором, а не программистом? Есть где глянуть примеры такой админки?
353
11 апреля 2008 года
Nixus
840 / / 04.01.2007
Вариант один: создание нескольких таблиц, которые будут хранить структуру элементов. Т.е. будет главная таблица + таблица свойств. При добавлении элемента в главную таблицу добавляется одна запись, а в таблицу свойств по одной записи для каждого свойства.
Очень медленный метод, огромные SQL запросы для выборки данных, но каждый товар может иметь уникальные свойства.

Вариант два: написание умной системы которая может сама создавать таблицы для новых типов товаров и уметь их изменять ALTER'ом при необходимости внесения или удаления свойств.
Очень быстрые выборки, но сложно написать. Каждый тип товаров может иметь уникальные свойства.

Возможны и другие варианты, гибридные.
333
11 апреля 2008 года
GHopper
200 / / 28.12.2004
мне бы глянуть разок на реализацию второго метода, а то я даже интерфейс придумать толковый не могу... Там ведь могут быть тип ENUM (например цвет атомобиля), чекбоксы, радиобуттоны...
17K
11 апреля 2008 года
HookEst
144 / / 27.03.2008
второй вариант, ИМХО, удобнее.
на сайте bitrix есть возможность в демке полазить, там много всяких интерфейсов, может чего полезного найдешь
37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
хм... Собственно как сделано на market.ngs.ru я знаю :)
Можно поподробнее узнать про второй вариант
353
06 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: A-Lex
хм... Собственно как сделано на market.ngs.ru я знаю :)
Можно поподробнее узнать про второй вариант


Конечно можно, никто не против.

37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
Так может просветишь или ссыль дашь где почитать?
353
06 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: A-Lex
Так может просветишь или ссыль дашь где почитать?


Конкретнее вопросы. В общем я все описал уже.

37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
Как я понял из твоего поста мы имеем таблицу разделов
CREATE TABLE `cat` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11) NOT NULL default '0',
`title` varchar(255) NOT NULL,
`eng` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`),
KEY `eng` (`eng`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Для каждого раздела "умным" скриптом создаётся табличка, со всеми необходимыми свойствами по товару из этого раздела. Например для незвижимости это колличество комнат, тип планировки, этаж, этажность дома; соответственно для сотовых телефонов имеем: модель, размеры, смарт/не смарт и тд... Естественно где-то храним, для какой таблицы какие поля какие данные несут.

А вот теперь представим себе что в наш каталог попадает база тогоже НГСа, тоесть примерно 2 млн вариантов недвижимости, около 5 тыс телефонов и куча всего другого в свои таблицы. Всё пока хорошо, искать удобно (так как всё в пределах одной таблицы). Но! (форс-мажор) Нам надо срочно добавить новое свойство для группы товаров, например для недвижимости "форма собственности". Предвставь себе ALTER TABLE, который будес перестраивать индекс более чем у 2х млн строк, а если у нас таблица MyISAM (юзаем FULLTEXT) то таблица заблокируется и пользователи обломаются?

Если я неправильно понял что-то поправь. Просто я встречался с подобной системой, это такой гемор её поддерживать.

Да, чуть не забыл, колличество таблиц в базе данных ограничено, и бесконечно плодить уникальные таблицы для каждой группы товаров мы не сможем
2
06 мая 2008 года
squirL
5.6K / / 13.08.2003
Цитата: A-Lex
Предвставь себе ALTER TABLE, который будес перестраивать индекс более чем у 2х млн строк, а если у нас таблица MyISAM (юзаем FULLTEXT) то таблица заблокируется и пользователи обломаются?



не удержался... ну так не юзайте убожество в виде MyISAM. и вообще откажитесь от MySQL ;-)

353
06 мая 2008 года
Nixus
840 / / 04.01.2007
И снова вопроса я не увидел. У любого метода есть недостатки и за все приходится чем-то платить.
37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
Цитата: squirL
не удержался... ну так не юзайте убожество в виде MyISAM. и вообще откажитесь от MySQL ;-)



А кто сказал что я его использую? Дамп таблицы видел?
Я говорю про общую идею.

37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
Цитата: Nixus
И снова вопроса я не увидел.



Хорошо, вот вопрос: второй метод, про который ты говорил, это то что описал я?

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

337
06 мая 2008 года
shine
719 / / 09.06.2006
Цитата: squirL
не удержался... ну так не юзайте убожество в виде MyISAM. и вообще откажитесь от MySQL ;-)


Кто там в разделе БД грозился за такие сообщения штрафовать вплоть до бана? :)

337
06 мая 2008 года
shine
719 / / 09.06.2006
Цитата: A-Lex
Если да, то первый значительно удобней и нет там никаких страшных запросов, всё зависит от того как спроектируешь структуру таблиц под параметры.


Первый вариант будет работать медленно. Медленно, хотя и достаточно гибко. Я когда-то что-то подобное делал.

37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
Цитата: shine
Первый вариант будет работать медленно. Медленно, хотя и достаточно гибко. Я когда-то что-то подобное делал.



Пока не замечал что это медленно работает. Единственная проблема - это поиск по этим параметрам. Сфинкс тут не прикрутишь, так как он пока не умеет искать по таким таблицам, хотя можно сэмитировать через MVA, а простой поиск требует либо несколько джоинов (по скольким параметрам ищем, столько раз и таблицу джойним), но тут ограничение в 32, либо OR и HAVING, что тормозит, так как индексы не юзает.

Я пока одно решение нашёл. Разбросал данные по полям, типа целые хранятся в одном поле, дроби в другом, словарные тексты в третьем (по этим полям строим составные индексы), а по чему не ищем храним в поле типа TEXT. По скольки параметрам ищем столько запросов и делаем, а потом ищем пересечение.

Если есть ещё какие варианты - просветите.

353
06 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: A-Lex
Хорошо, вот вопрос: второй метод, про который ты говорил, это то что описал я?


Да, он самый. И это весь вопрос?

Цитата: A-Lex
Если да, то первый значительно удобней и нет там никаких страшных запросов, всё зависит от того как спроектируешь структуру таблиц под параметры.


Ты меня поравить в чем-то хочешь? Не понимаю смысл твоих сообщений в мой адрес.

37K
06 мая 2008 года
A-Lex
11 / / 05.05.2008
В твой адрес я ничего не пишу, я просто хочу выяснить какие существуют методы для хранения в реляционыых базах данных неоднородных структур, грубо говоря, как сэмитировать документно-ориентированную бд, например Lotus/Domino.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог