Ищу способы представления объектов в БД

kas

Guest
Ищу способы представления объектов в БД

Интересует следущая проблема, возможно кто-то сталкивался...
Есть система, которая хранит объекты различного типа (веб-страницы, товары, новости и прочее), причем система позволяет сама создавать любой тип объекта (типы ограничены хранимыми в мускл типами данными и плюс существуют типы данных расширенные, как например списки). Объекты организованы деревом. Для каждого объекта создается пользователем набор атрибутов (заранее количество атрибутов неизвестно и количество может быть бесконечным). Вопрос заключается в следющем: как хранить атрибуты различного типа для объектов?
Самый просто способ конечно это сделать таблицу атрибутов и связать ее один ко многим с таблицей объектов, но из-за того что втрибуты могут быть различных типов (например текст и целые), поле для хранения значений атрибутов должно быть максимальным по размеру, чтобы вместить любой допустимый тип. Это неприемлимо, потому что скажем если пользователь создал объекты типа телевизоры и для него назначил атрибут диагональ то когда-нибудь точно потребуется найти все телевизоры с диагональю больше чем Х и это будет тяжело работать в муксл, потому что значения хранятся в поле Текст.
Другой вариант это хранить сериализованный массив, но опять же неприемлимо потому что если опять искать телевизоры с диагональю более Х, придется передать все объекты и потом на стороне пхп уже делать unserialize.
Можно конечно создавать под каждый тип объектов таблицу атрибутов, при изменении набора атрибутов делать alter table, но тут возникает другая проблема. например необходимо в дереве получить все объекты с определенным родителем у которых есть атрибут name, придется перебирать все таблицы и потом склеивать результаты.
Можно сделать таблицу атрибутов и сделать скажем для нее не одно поле в котором хранится значение атрибута, а сделать столько полей сколько типов данных и поставить доп. поле в котором хранить какой тип данных атрибута используется, но опять по-моему бред получается.
Может есть уже какие-то решения этой задачки?
 
Сверху