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

Ваш аккаунт

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

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

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

Сложно структурированные данные в MySQL

537
17 мая 2004 года
Cover
87 / / 14.11.2002
Вот к примеру, есть у нас каталог товаров. У каждого товара есть свойства:
цена, количество, название, описание, и пр.
Описание состоит из блоков:
Вес:
Цвет:
Размер экрана
Длина кузова
пр.

Реальных примеров таких каталогов полно - в инет-магазинах сотовых телефонов, например. Там на каждый товар есть описание. Причём пункты в описании не обязательно одинаковые.

Меня интересует, как эту инфу о товаре хранить в базе. Т.е. как хранить цену, количество - это понятно - заводятся поля в таблице.
А вот как хранить "структурированное" описание товара?

Если просто полем "text", в котором html-ный код или просто многострочный текст, то это как-то не интересно. Главный недостаток в этом - это административный модуль. Там придётся делать что-то типа:
Введите название товара
Введите цену
Введите описание: //а сюда админ должен будет писать всё в ХТМЛ//

Практика показывает, что если админам давать такую свободу, то они там много чего натворить могут.
Хочется, чтобы в описание товара, администратор добавлял именно "поля" и "значения" полей.


У меня есть некоторые мысли в голове, как это сделать, но хочется узнать другие мнения.
Какие у кого есть по этому вопросу соображения??
1.3K
18 мая 2004 года
zja
119 / / 25.11.2003
можно классифицировать информацию о товаре, в этом смысле с точки зрения mysql очень популярен тип tinyint(1) NOT NULL default '0' или по простому boolean. Например, товар - телефоны, телефон может обладать кучей свойств и примочек типа например наличия GPRS, в самом простом случае достаточно создать таблицу состоящую из столбцов а-ля has_gprs, has_wap, и т.д. или просто gprs, wap и т.д. значение 1 (true) будет соответветствовать наличию данной примочки, сообразно 0(false) ее отсутствию, для примочек которые характеризуются вторичными признаками, можно создавать дополнительные табицы, а в качестве самого признака использовать NULL в случае его отсутствия или число-ключ типа int(11) для обозначения внешнего ключа таблицы дополнительных параметров этой примочки(а можно и просто столбцов в таблицу добавить). Вообще SQL (и MySQL в частности) дает огромное многообразие вариантов построения конкретной базы данных, другой вопрос - её функциональность, т.к. сразу необходимо продумать добавление новых, пока не существующих свойств данного товара (для телефонов это очень думаю актуально, т.к. новые примочки появляются каждый день), так же продумать скорость базы данных, если все примочки товара слепить в одну здоровую таблицу она будет реально тормозить, будет много избыточных, пустых полей и т.д. и опять же если разбрасывать примочки по более мелким таблицам нужно продумать грамотную организацию ключей, и не раз все протестить на все операции бд, включая критические ака дамп и воостановление базы в случае сбоя, не стоит при этом думать что все работает по тому что вы добавили одну запись, потом стерли, потом добавили и вроде все нормально, MySQL не поддерживает транзакции! помните это (по крайней мере не поддерживала, сейчас может уже и поддерживает), т.е. всегда есть вероятность того, что база будет делать не то что вы от нее ждете и если вовремя этот момент не пофиксить стрессовым тестированием, то потом когда база заполнится будет очень сложно поймать ошибку и трудоемко ее исправить, т.к. придется работать с уже готовым множеством записей, а оно легко может достигать тысяч и даже миллионов записей даже на проектах со средней посещаемостью.
эээ, что-то я отвлекся от сути, короче админу в результате можно выдать форму html где ему нужно будет только проставлять свойства галочками есть/нет и вводить конкретные числа, если у данного свойства есть уточнения. А хтмл давать или не давать, это уже вопрос личных предпочтений, иногда бывает удобно подчеркнуть какое-нибудь свойство на лету добавив пару тегов, это уже кому как... хотя если этих админов больше 1 шт, то наверное все же лучше ограничить доступ к введению напрямую html, а если пишешь под себя, то почему бы не оставить такую возможность.
з.ы. прошу прощения за ошибки.
1.9K
18 мая 2004 года
HabaHaba
172 / / 24.12.2003
Цитата:
Originally posted by Cover
Вот к примеру, есть у нас каталог товаров. У каждого товара есть свойства:
......
Меня интересует, как эту инфу о товаре хранить в базе.
....
А вот как хранить "структурированное" описание товара?
.....


Привет. В принципе, вариантов тут несколько.
1. Хранение свободной структуры свойств.
Условно говоря, у тебя есть примерно такой набор таблиц:
Таблица продуктов
product
id
name

Таблица свойств
properties
id
name

Таблица значений свойств для каждого продукта
values
id
product_id
property_id
value

+ ещё нужно ввести либо типы продуктов и их связь со свойствами либо табличку связей продуктов со свойствами что бы заранее знать что для этого продукта нужно заполнять.
Этот вариант, в принципе, достаточно гибкий и удобный если бы не одно но -- если ты работаешь с MySQL, будет очень сложно осуществлять поиск по свойствам, что часто необходимо.
2. Хранение заранее заданного набора свойств
Ну тут всё тривиально и громоздко, правда если свойств не очень много -- может прокатить.
product
id
name

properties
id
product_id
int_value1
int_value2
....
date_value1
...
Ну и так далее. То есть, заводишь по 2-5 полей для каждого типа данных и для каждого типа продуктов запоминаешь что где лежит.
3. Хранение шаблона
А это развитие твоей идеи с HTML-ом.
Делаешь для каждого типа продуктов html-шаблон в котором сам описываешь свойтва,
цепляешь к админ-части какой-нибудь визуальный редактор типа htmlarea и перед заведением нового продукта, запрашиваешь этот шалон из базы и выводишь его в редактор. А админ просто заполняет пустые поля.
Ну вот такие вот идеи :)

291
18 мая 2004 года
gufy
703 / / 08.01.2003
т.е. тебе по сути надо хранить то что называется запись или объект с заранее неизвестными свойствами?
посмотрев мануалу, я составил впечатление, что в MYSQL нет достойных структур данных для объектов. **или я их не нашел - т.е. имхо**
можно попробовать деревья, которые нынче очень удобно представлять методом nested sets.

//см. http://detail.phpclub.net/article/db_tree
http://www.codenet.ru/webmast/php/tree.php

так, листьями в дереве будут значения свойств, например 54мм, уровнем выше - сами свойства - например, толщина, а еще уровнем выше - товары. при желании, можно организовывать товары в подкатегории, подкатегории в категории, и т.д., каждый раз добавляя новый уровень к дереву.
1.9K
18 мая 2004 года
HabaHaba
172 / / 24.12.2003
Цитата:
Originally posted by gufy
...
можно попробовать деревья, которые нынче очень удобно представлять методом nested sets.
...


Ага, это интересная идея. Я об этом думал, но что то мне показалось, что при более-менее приличном кол-ве товаров может начать здорово тормозить. Во всяком случае, при добавлении нового товара -- точно.
А вообще, идея хорошая, было бы правильно попробовать.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог