Конференция "Базы" » Проектирование БД. Таблицы с неизвестным количеством полей [D7, FireBird]
 
  • sniknik © (19.02.13 13:26) [40]
    > Вот JOIN'ы в часто выполняемых запросах - это зло.
    т.е. "3 нормальная" и фактически любой справочник с атрибутами - зло. а плоская растущая "вширь" таблица (на каждый атрибут меняется структура) - добро.
    ???
  • IronFox © (19.02.13 13:49) [41]

    > т.е. "3 нормальная" и фактически любой справочник с атрибутами
    > - зло. а плоская растущая "вширь" таблица (на каждый атрибут
    > меняется структура) - добро.???


    Если атрибуты в справочнике известны заранее - никто не против.
    Зачем JOIN'ы, кроме редких отчетов использовать - вот в чем вопрос.
    Запросы должны хорошо индексироваться.

    Я имею в виду три основных таблицы

    1.Справочник - 2.таблица соответствия атрибутов справочнику - 3.Атрибуты (там еще справочник атрибутов, но это уже не важно).
    Во 2-й таблице прописываются ID атрибута и ID справочника - все это работает влет при использовании индексов по ID во всех трех таблицах.

    Или я что-то не так трактую. А насчет 3-й нормальной: при такой структуре, как я описал, должно быть меньше избыточных данных.
  • Медвежонок Пятачок © (19.02.13 13:59) [42]
    Так у тебя же тоже зло злостное.
    Сплошные джойны по крайней мере трех таблиц.
  • IronFox © (19.02.13 14:02) [43]
    Вообще-то да. При выборке дерева без них не обойтись...
  • IronFox © (19.02.13 14:05) [44]
    Точнее, можно, обойтись. Но это вряд ли будет работать быстрее.
  • sniknik © (19.02.13 14:14) [45]
    > при такой структуре, как я описал ...
    промежуточная (2.таблица соответствия атрибутов справочнику) лишняя.

    а так... ты ничего не изобрел, структура банальна, и джойнов там будет масса. а вот по предыдущему описанию это должна быть одна таблица, джойнов нет.
  • Игорь Шевченко © (19.02.13 18:20) [46]
    "Довольно часто встречаются приложения, построенные с использованием универсальных моделей данных для максимальной гибкости, и приложения, построенные так, что они мешают работе. Например, хорошо известно, что можно представить любой объект в базе данных используя только четыре таблицы:

    create table objects (oid int pimary key, name varchar2(255));
    create table attributes (attrid int primary key, attrname varchar2(255),
     datatype varchar2(25));
    create table object_attributes (oid int, attrid int, value varchar2(4000),
     primary key (oid,attrid));
    create table links (oid1 int, oid2 int, primary key (oid1, oid2));

    Но как такая модель работает ? Простой запрос select first_name, last_name from person трансформируется в соединение трех таблиц с аггрегированием, более того, если имеются атрибуты NULLABLE - в таком случае может не быть строки в таблице object_attributes для некоторых атрибутов, - возможно, возникнет необходимость использовать внешнее соединение, которое может исключить оптимальные планы запросов из рассмотрения.

    Мой совет всем: будьте более специализированы м менее универсальными. Несомненно, общий подход более гибкий, но менее производительный, более сложный, с точки зрения формирования запросов и сопровождения. Не используется словарь данных и метаданные. Те, кто применяет универсальный подход, загоняют себя в угол."

    (с) Том Кайт "Эффективное проектирование приложений Oracle"
  • vuk © (20.02.13 16:00) [47]
    to Игорь Шевченко ©   (19.02.13 18:20) [46]:

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

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

    За других ничего говорить не буду. Скажу за себя только. У нас везде применяется специализированный подход. Кроме одного места - каталог технических характеристик товаров. Там применена схема с атрибутами и значениями.
  • Кщд (20.02.13 19:24) [48]
    >vuk ©   (20.02.13 16:00) [47]
    если не комм. тайна, можно узнать порядок кол-ва товаров и среднее кол-во характеристик по товару?
  • vuk © (20.02.13 19:37) [49]
    Товары - чуть меньше 200 тыс.
    Характеристики товаров: общее количество записей- 1.3 млн, количество характеристик на товар - от 1 до 37
  • Игорь Шевченко © (20.02.13 19:45) [50]
    vuk ©   (20.02.13 16:00) [47]


    > Я это, кстати, в ответ ровно на эту же цитату как-то уже
    > в потрепаловке писал.


    По-моему мы тогда пришли к общему знаменателю, что марксизм не догма, а руководство к действию.
  • vuk © (20.02.13 20:03) [51]
    to Игорь Шевченко ©   (20.02.13 19:45) [50]:

    > По-моему мы тогда пришли к общему знаменателю, что марксизм
    > не догма, а руководство к действию.

    Ну, в обчем-то, да. :)
  • Кщд (21.02.13 09:29) [52]
    >vuk ©   (20.02.13 19:37) [49]
    на современном железе при порядке записей 10^6 EAV, конечно, взлетит
  • sniknik © (21.02.13 10:56) [53]
    > на современном железе при порядке записей 10^6 EAV, конечно, взлетит
    а чё нет, на "не современном"? при такой структуре максимум с чем придется работать 1 запись из товара (индексный поиск) + макс. 37 связанных с ней записей атрибутов (связь по индексу)... внутри 37 пусть даже множественным перебором много времени не займет. 286й под досом справится.
  • vuk © (21.02.13 11:03) [54]
    Во многом применимость зависит от того, какие требования предъявляются и какие потом выборки будут работать. В данном случае могу сказать, что в требованиях была возможность определения наборов характеристик пользователями, а выборок, требующих разворачивать характеристики в строку не предвиделось (собственно, надобности в таких выборках так и не появилось за 10 лет). зато, например, возможность поиска товаров по значениям атрибутов является необходимой
  • Кщд (21.02.13 12:06) [55]
    >sniknik ©   (21.02.13 10:56) [53]
    взятие всех атрибутов по товару - это типовая операция, которая и на 10^9 взлетит - спору нет, индексы наше всё)
    но есть ещё и другие типовые: например, поиск по значению нескольких характеристик с выводом найденных товаров и некоторых(всех) их характеристик
    проблемы EAV начинаются именно отсюда
  • vuk © (21.02.13 12:29) [56]
    to Кщд   (21.02.13 12:06) [55]:

    > например, поиск по значению нескольких характеристик

    Не представляет из себя какой-либо проблемы вообще. :) Потому, что сводится к выборке по одному полю одной таблицы. Ну, или если хочется задать набор атрибутов, где будет производиться поиск - по двум полям.


    > с выводом найденных товаров и некоторых(всех) их характеристик

    Как я уже говорил, практика показала, что вывод характеристик в строку оказался не нужен.

    Если говорить именно о товарах, то на практике более актуальным является вывод таблиц сравнения характеристик, типа того: http://www.fcenter.ru/compare.shtml?108137,103642,106119,97418,107801
  • Сергей М. © (21.02.13 13:52) [57]

    > Ашот ака Kaif, писал что что-то такое у него юзается.
    > Вот мне с тез пор и интересно, как сделал.


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

    А сделал Ашот вполне по уму, imho поумнее чем в 1C
  • Сергей М. © (21.02.13 14:01) [58]
    Позволю себе процитировать касающийся этой темы фрагмент документации разработчика на платформе Аллегро:


    > Глава 7. СПРАВОЧНИКИ
    >
    > Классы, атрибуты, наследование
    >
    > Каждый регистр счетов привязан к одному справочнику объектов,
    >  например , «Товары». Допустим, что мы автоматизируем работу
    > компании, торгующей металлическими изделиями (винтами и
    > т. п.) и обувью. Очевидно, что разные товары могут иметь
    > разные атрибуты. Атрибутами винтов могут быть « Металл»,
    >  «Диаметр» и «Длина». Атрибутами обуви - «Материал», «Изделие»,
    >  «Размер », «Цвет» и «Вид». Кроме винтов , возможно, нам
    > понадобится в справочниках хранить разные другие металлические
    > изделия, характеризующиеся «Металлом» и «Наименованием ».
    >  К тому же неплохо бы иметь в качестве общего атрибута «Внутренний
    > номер объекта» (ID), чтобы использовать этот атрибут в других
    > таблицах для ссылки на объекты справочной системы. С учетом
    > сказанного, нам необходимы минимум три таблицы для хранения
    > «Товаров»:
    >
    > «Обувь»
    >
    > ID  Материал  Изделие  Размер  Цвет  Вид
    >                
    >
    > «Винты»
    >
    > ID  Металл  Диаметр  Длнна
    >          
    >
    > «Разный крепеж»
    >
    > ID  Металл  Наименование
    >        
    >
    > Как легко заметить, некоторые таблицы имеют общие по смыслу
    > поля. Например, все три таблицы имеют поле ID . Винты и
    > разный крепеж имеют общее поле «Металл ». Напрашивается
    > мысль о том, чтобы хранить однородную информацию в одном
    > месте, а не в разных таблицах. И действительно, если мы
    > введем понятия «Товар вообще » и «Крепеж вообще», то задача
    > намного упростится . Атрибут ID характеризует любой «Товар
    > вообще», а атрибут «Металл» характеризует любой «Крепеж
    > вообще». Можно даже сказать, что классы «Винты» и «Разный
    > крепеж» наследуют атрибут «Металл» от класса «Крепеж вообще».
    >  Что же у нас получилось ? Фактически это справочная система
    > с некоторыми объектно-ориентированными свойствами. Все объекты
    > у нас разделены на классы. Собственно, каждый конкретный
    > справочник и есть класс. Классы образуют дерево с наследованием
    > атрибутов старших классов младшими классами. Каждый класс,
    >  таким образом, имеет собственные атрибуты и атрибуты, унаследованные
    > от класса-предка. Каждому классу соответствует одна физическая
    > таблица в базе данных, в этой таблице класс хранит только
    > собственные атрибуты. Для полной сборки любого справочника
    > наша программа автоматически производит объединение всех
    > таблиц классов -предков с таблицей класса справочника по
    > полю «Номер объекта» (ID).
    >
    > Например, если мы хотим создать классы «Товары», «Крепеж»,
    >  «Винты», «Другой крепеж», «Обувь», то выглядит это примерно
    > так:
    >
    >
    > Таким образом, для строгого хранения данных, они разносятся
    > по нескольким таблицам. И каждый объект одновременно хранится
    > в разных таблицах. Часть атрибутов справочника «Винты» хранится
    > в таблице класса «Крепеж». Поэтому для того, чтобы отобразить
    > все атрибуты «винтов», как собственные, так и унаследованные
    > от классов-предков, необходима « сборка данных» (по одной
    > строке из разных таблиц ). Например, для сборки справочника
    > «Винты» будут объединены таблицы: «Товары», «Крепеж» и «Винты»
    > по полю ID. А для сборки справочника «Разный крепеж» будут
    > объединены таблицы «Товары », «Крепеж», «Разный крепеж».
    >
    >
    > К счастью, язык структурированных запросов SQL позволяет
    > делать такие объединения таблиц достаточно быстро. Наша
    > программа устроена так, что сборка справочников происходит
    > автоматически путем генерации текстов SQL- запросов. Ничего
    > программировать не нужно.
    >
    > Атрибутом класса может быть число, строка, дата, мемо-поле,
    >  картинка или ссылка на объект другого класса. В приведенном
    > нами примере, например, поля Материал, Изделие, Цвет и Вид
    > в действительности следует организовать в виде ссылок на
    > отдельные мелкие справочники:
    >
    > «Материалы для обуви»
    >
    > ID  Наименование
    > 25  Кожа
    > 27  Пластик
    > 28  Резина
    >
    > «Обувные изделия»
    >
    > ID  Наименование
    > 38  Сапоги
    > 39  Кроссовки
    > 40  Туфли
    >
    > «Цвета»
    >
    > ID  Наименование
    > 95  Черн.
    > 96  Коричн.
    >
    > «Виды обуви»
    >
    > ID  Наименование
    > 70  Муж.
    > 71  Жен.
    >
    > Итак, в реальности в таблице класса «Обувь» в основном хранятся
    > ссылки:
    >
    > «Обувь»
    >
    > ID  Материал  Изделие  Размер  Цвет  Вид
    > 487  25  38  37  95  71
    > 511  25  40  37,5  96  71
    >
    > Разрешение ссылок (превращение ID в краткие наименования)
    > программа осуществляет автоматически, присоединяя при сборке
    > справочника еще и специальную таблицу наименований, так
    > что пользователь видит нормальную таблицу, содержащую в
    > колонках соответствующие названия, а не внутренние номера
    > , которые реально хранятся в базе. Все объекты справочной
    > системы имеют уникальные внутренние ID, которые поставляет
    > генератор OBJECT _ID_GEN.
    >
    > Такая организация справочной системы позволяет одновременно
    > решить ряд проблем:
    >
    >     Регистру счетов достаточно присвоить базовый класс какого-
    > то дерева классов справочной системы и тот сможет работать
    > одновременно со всеми объектами классов-потомков, какой
    > бы атрибутикой те не обладали. А это означает для программиста,
    >  конфигурирующего систему под задачу пользователя, возможность
    > быстрого и корректного анализа бухгалтерских данных по любому
    > атрибуту каждого отдельно взятого класса.
    >
    >     Декларативная ссылочная целостность (на основе ключей
    > foreign keys) пронизывает всю систему ссылок и не позволяет,
    >  с одной стороны, случайно удалить ни один объект, используемый
    > в других справочниках или документах, а с другой стороны
    > предельно повышает скорость объединения таблиц при сборке
    > справочников. Важно и другое - сообщение о невозможности
    > удаления объекта пользователь получает мгновенно .
    >
    >     Ссылочная природа справочников позволяет автоматически
    > подчинять два справочника друг другу , для чего окно справочника
    > делится пополам. В этом режиме в нижней части окна отображаются
    > закладки всех справочников, которые могут быть подчинены
    > справочнику, отображаемому в верхней части . Остается лишь
    > выбрать нужную закладку. Например, перебирая «обувные изделия»,
    >  можно тут же видеть всю обувь , отфильтрованную по данному
    > признаку. Или, выбрав « Фирму», автоматически видеть все
    > ее реквизиты. И все это без потери скорости, благодаря индексам.
    >  
    >
    >     Всегда можно добавить новый атрибут в класс и его автоматически
    > приобретут все объекты классов-потомков.
    >
    >     Способ хранения данных соответствует самым строгим требованиям
    > теории реляционной баз данных (степень нормализации 3…5),
    >  что значительно упрощает использование данных в SQL-запросах
    > и повышает непротиворечивость хранимой информации и устойчивость
    > данных к изменению структуры справочников.
  • O'ShinW © (21.02.13 14:55) [59]

    > Сергей М. ©  

    да, пожалуй что, надо скачать все-таки
    тут надо почитать вдумчиво
 
Конференция "Базы" » Проектирование БД. Таблицы с неизвестным количеством полей [D7, FireBird]
Есть новые Нет новых   [134430   +3][b:0][p:0.001]