powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Прошу совета в реализации базы.
15 сообщений из 15, страница 1 из 1
Прошу совета в реализации базы.
    #34280409
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый всем день!
У меня такой вопрос:
Хочу написать что то навроде каталога по различным типам товаров, с их подробным описанием и с возможностью выбора элементов каталога по их свойствам.
Примерная идея реализации у меня такая:
Код: plaintext
1.
2.
3.
4.
Table katalog {
      id                int unsigned not null auto_increment primary key,
      itemName     varchar( 20 ) not null,
      itemDescr     Text not null
}
При этом в поле itemDescr предполагаю информацию хранить в виде напоминающем xml, т.е.
Код: plaintext
<param1>value1</param1><param2>value2</param2>...
У разных товаров будет разное количество свойств. именно поэтому я и думаю что надо это реализовывать в одном столбце.. столбец данный будет проиндексирован. выборка будет строиться на основании запросов вида
Код: plaintext
SELECT ....... LIKE "%<param>value</param>%" ......
Так вот вопросы следующие:
Имеет ли смысл моя идея реализации такой задумки?

Как лучше хранить данные (имеется ввиду как раз описание товаров с их свойствами)

Какой лучше сервер БД выбрать для этого (я так понимаю он должен очень быстро работать с полнотекстовым поиском)

Как реализуется индекс текстового поля в БД? Т.е. в приведенном мною примере хранения описаний будет ли индекс ускорять поиск например по строке LIKE "%value2%"?

Как лучше выбирать данные, с помощью LIKE или регулярных выражений?

И вообще любые другие мнения и советы на этот счет приветствуются.

PS. Очень прошу давать ответы с объяснением той или иной позиции, а то фразе "Oracle используй" сложно доверять, потому как ни аргументов, ни чего... прошу отнестись серьезно, либо просто пропустить данный топик.
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34280429
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>> Имеет ли смысл моя идея реализации такой задумки?

Лишённой смысла её определённо не назовёшь.

>>> Как лучше хранить данные (имеется ввиду как раз описание товаров с их свойствами)

Уже обсуждали в форуме. Поскольку описание всётаки структурировано, то и хранить лучше в структурированном виде.

>>> Какой лучше сервер БД выбрать для этого (я так понимаю он должен очень быстро работать с полнотекстовым поиском)

Так и скажу - Оракл используй.

Поддержка XML и регулярных выражений всроена в СУБД и ничего похожее на XLM выдумывать не надо. XML можно текстом хранить, можно в реляционное представление преобразовать.

Есть модули для индексирования текста и поиска слов в тексте, хотя возможно тебе и XML хватит.

>>> Как реализуется индекс текстового поля в БД? Т.е. в приведенном мною примере хранения описаний будет ли индекс ускорять поиск например по строке LIKE "%value2%"?

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

>>> Как лучше выбирать данные, с помощью LIKE или регулярных выражений?

Лучше искать записи с помощью операторов контекстного поиска. Если говорить о полном сканировании всех текстов, то я думаю LIKE будет быстрее, потому что оно проще. Но точный ответ дадут только испытания конкретной СУБД.

>>>И вообще любые другие мнения и советы на этот счет приветствуются.

Уже обсуждали в форуме.
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34280448
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за полный и развернутый ответ.. у меня только есть одно "но"..... Oracle же насколько я знаю платная БД, и стоит немалых денег... так как идею я хочу в дальнейшем использовать практически, а никакого финансирования за мной не стоит, то мне скорей всего хотелось бы услышать советы по поводу реализации и деталей реализации на свободных СУБД. Их ведь я так понимаю тоже немало....
Есть ли достойные альтернативы Oracle но свободные?
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34280623
RENaissance
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Oracle есть бесплатная редакция OracleXE. Также, у MSSQL2005 есть бесплатная редакция MSSQL2005 Express Edition, ктороая тоже
умеет работать с XML.


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34280751
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин.. бесплатные редакции это конечно хорошо.. хотя у них наверное есть какие то ограничения. Но это я посмотрю в интернете уже.
Тогда сразу хочу спросить следующий вопрос по своей задумке :)
Допустим есть таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Table Price {
     id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   itemName   VARCHAR( 70 ) NOT NULL,   //Название товара в прайсе продавца
   itemSeller   INT UNSIGNED NOT NULL,  //ID продавца 
   itemUniqID  INT UNSIGNED NOT NULL,  //ID соответствующего уникального описания  
}
Table Unique {
     id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    uniqSign    VARCHAR( 255 ) NOT NULL,
    uniqDescr  TEXT
}

И в таблице Price содержатся "сырые" данные из прайсов продавцов. Т.е. например для одного и того же товара у двух разных фирм могут быть названия "Samsung GHF78 78'' Flat panel" и "Телевизор 78'' SAMSUNG <GHF78>", поле itemUniqID указывает как раз на их уникальное описание. Т.е. у двух этих товаров значение этого поля будет одно и то же.

В Таблице Unique поле uniqSign содержит строчки по которым можно идентифицировать данный элемент однозначно из таблицы Price. Т.е. для указанных выше двух товаров это может быть строчка GHF78. И соотнесение записей из таблицы Price к записям таблицы Unique можно сделать
Код: plaintext
UPDATE Price,Unique SET Price.itemUniqID=Unique.id WHERE Price.itemName LIKE CONCAT(CONCAT("%",Unique.uniqSign),"%")
Так вот вопроса по этому поводу у меня два:
Опять же имеет ли смысл такая реализация идеи? И насколько она оптимальна в плане производительности, при условии что записей в Price порядка 5 миллионов, а в таблице Unique около 50000 (хотя скорей всего меньше)? Если есть более оптимальный вариант, то с радостью его выслушаю.

Как лучше реализовать случай, когда для условия для идентификации используется несколько подстрок? Т.е. например строки идентичны тогда, когда
Код: plaintext
....(Price.itemName Like "%sign1%" ) AND (Price.itemName LIKE "%sign2%")....
На ум приходит опять же реализация в XML подобном виде
Код: plaintext
<SIGN1>substr1</SIGN1><SIGN2>substr2</SIGN2>....
Только вот как автоматизировать соотнесение записей в одном запросе и возможно ли это вообще? Может с помощью процедур или еще какие ухищрения?
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34281073
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаПри этом в поле itemDescr предполагаю информацию хранить в виде напоминающем xml, т.е.
Код: plaintext
<param1>value1</param1><param2>value2</param2>...

Параметры могут быть не строковыми (например, от 2 до 5)

Генерация вот этой вот строки
Код: plaintext
<param1>value1</param1><param2>value2</param2>...
для 5 миллионов неструктурированных записей та еще задачка.
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34281249
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаДопустим есть таблицы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Table Price {
     id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
   i VARCHAR( 70 ) NOT NULL,   //Название товара в прайсе продавца
   itemSeller   INT UNSIGNED NOT NULL,  //ID продавца 
   itemUniqID  INT UNSIGNED NOT NULL,  //ID соответствующего уникального описания  
}
Table Unique {
     id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    uniqSign    VARCHAR( 255 ) NOT NULL,
      TEXT
}

И в таблице Price содержатся "сырые" данные из прайсов продавцов. Т.е. например для одного и того же товара у двух разных фирм могут быть названия "Samsung GHF78 78'' Flat panel" и "Телевизор 78'' SAMSUNG <GHF78>", поле itemUniqID указывает как раз на их уникальное описание. Т.е. у двух этих товаров значение этого поля будет одно и то же.

В Таблице Unique поле uniqSign содержит строчки по которым можно идентифицировать данный элемент однозначно из таблицы Price. Т.е. при любом изменении temName или uniqDescr запускается процедуруа, пересчитывающая itemUniqID ?
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34282640
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гуляев ГошаБлин.. бесплатные редакции это конечно хорошо.. хотя у них наверное есть какие то ограничения.

Для Oracle размер БД max 4 ГБ, некоторых опций, которые необходимы для больших БД нет. В остальном один X.
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34284194
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRТ.е. при любом изменении temName или uniqDescr запускается процедуруа, пересчитывающая itemUniqID ?
Нет не прикаждом, а просто регулярно. Т.е. прайсы собираются в таблицу Price. Потом для записей уже идет процедура сопоставления с описанием. Кстати сразу еще вопрос:
Если я хочу сделать Update для таблицы в которой миллионы записей, но обновляться будут только записи с определенным значением числового поля, которое к тому же индекс, т.е. например хочу обновить все записи принадлежащие одной фирме. Как можно оптимизировать это? Я так понимаю запрос:
Код: plaintext
select * from table where firmID=X
будет выполняться достаточно быстро для таблицы с несколькими миллионами записей, так вот как бы реализовать UPDATE именно для этой выборки? Я просто не уверен, что запрос
Код: plaintext
UPDATE table SET .... WHERE firmID=X AND .....
будет работать также быстро, т.е. по такому алгоритму, или я ошибаюсь? Может стоит использовать курсоры?

stiПараметры могут быть не строковыми (например, от 2 до 5)

Генерация вот этой вот строки
Код: plaintext
<param1>value1</param1><param2>value2</param2>...
для 5 миллионов неструктурированных записей та еще задачка.
Про нестроковые параметры не совсем понял.. параметры могут быть разными.. и строковыми и числовыми

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

И все же остается вопрос про то как реализовать UPDATE для какой либо таблицы, при этом подстроки должны браться из поля другой таблицы. Сумбур. Например:
В таблице Pattern, поле pattXML есть данные:
Код: plaintext
<DAT1>string1</DAT1><DAT2>string2</DAT2>
так вот на основании этих данных должен выполниться запрос:
Код: plaintext
UPDATE table SET ... WHERE (someField LIKE "%string1%") AND (someField LIKE "%string2%")
можно ли условия ...LIKE... конструировать прямо в запросе? или это надо делать програмно на уровне php для каждой конкретной pattXML?
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34284773
sti
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПро нестроковые параметры не совсем понял.. параметры могут быть разными.. и строковыми и числовымиВот вам товар:
Код: plaintext
Подгузники Huggies Begin № 46   3 - 6  кг
Как вы запишете 3-6 кг? Ведь при поиске я могу хотеть задать 5 кг.

Вообще мне больше нравится подход вроде
тынц
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34284960
Гуляев Гоша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sti авторПро нестроковые параметры не совсем понял.. параметры могут быть разными.. и строковыми и числовымиВот вам товар:
Код: plaintext
Подгузники Huggies Begin № 46   3 - 6  кг
Как вы запишете 3-6 кг? Ведь при поиске я могу хотеть задать 5 кг.

Вообще мне больше нравится подход вроде
тынц

Ссылка на самом деле очень помогла и как бы блин мне кажется реализация такая даже гораздо легче чем моя.... сейчас помозгую над ней... думаю вопросы еще появятся
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34302093
Lexoos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenab Гуляев ГошаБлин.. бесплатные редакции это конечно хорошо.. хотя у них наверное есть какие то ограничения.

Для Oracle размер БД max 4 ГБ, некоторых опций, которые необходимы для больших БД нет. В остальном один X.

а как можно реализовать XSLT преобразования, используя OracleXE? Думаю, топистартеру будет это тож интересно
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34302262
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lexoosа как можно реализовать XSLT преобразования, используя OracleXE? Думаю, топистартеру будет это тож интересно

Для этого оракл предоставляет XML Developer's Kit. Сам как то пробовал выполнить преобразование, но что то у меня не получилось. Наверное руки кривые.
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34316733
Фотография shelsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Описание решения такой задачи есть. Даже есть термин для таких задач "Объектно-реляционная модель". Т.е. когда работаем с единичной категорией, например товаром, то это "объект", а когда ищем данные это реляционная таблица. Короче можно в поисковиках поискать ...

В данной задача я бы разделил атрибуты товаров на обязательные (т.е. общие, линейные - которые необходимы для решения задачи в конкретной в предметной области - например складской учет (наименование, цена, и т.д.) и описательные (индивидуальные характеристики - цвет, фасон). Первые храняться в полях реляционной таблицы - вторые в отдельном поле этой таблице в виде XML.

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



Код: plaintext
1.
2.
... Как что достать - вторая эскадрилья. А как самолеты сбивать - первая эскадрилья ...
...
Рейтинг: 0 / 0
Прошу совета в реализации базы.
    #34317657
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabДля этого оракл предоставляет XML Developer's Kit. Сам как то пробовал выполнить преобразование, но что то у меня не получилось. Наверное руки кривые.
Мой коллега таки осилил. Я так понял, проблема была собственно написать ЧЫДЕ тому, кто делал это впервые в жизни, а вызвать из оракла - получилось легко и непринужденно.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Прошу совета в реализации базы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]