powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / EAV сортировка
15 сообщений из 15, страница 1 из 1
EAV сортировка
    #34430049
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Существует база объектов определенных типов, у каждого типа есть свойства, специфичные для этого типа.

Предположим, есть 3 объекта: морковка (вес, калорийность), огурец(вес, калорийность), лопата(ширина, длина).
У морковки и огурца есть свойство - калорийность, у лопаты его нет и не может быть.
Но вдруг захотелось странного - получить список всех трех объектов, отсортированных по значению одного свойства (калорийность).
Каким запросом это можно сделать?
Это вообще возможно или надо как-то менять схему?
Подскажите, пожалуйста.


Схема:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
таблица objects
-----------
ID smallint( 6 ) NOT NULL auto_increment,
TypeID tinyint( 4 ) NOT NULL default '0'
-----------

таблица proplist
-----------
ID smallint( 6 ) NOT NULL auto_increment,
TypeID tinyint( 4 ) NOT NULL default '0',
Prop char( 10 ) NOT NULL default ''
-----------

таблица properties
-----------
ID mediumint( 9 ) NOT NULL auto_increment,
OID smallint( 6 ) NOT NULL default '0',
propID smallint( 6 ) NOT NULL default '0',
Value varchar( 100 ) NOT NULL default ''
-----------
...
Рейтинг: 0 / 0
EAV сортировка
    #34430089
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно все. Но как только появляется желание выполнить с атрибутом некую операцию "над многими записями", появляется подозрение, что EAV для этого атрибута была выбрана совершенно напрасно.

Ну а в данном случае - скажем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
  o.*
from 
  objects o 
    left outer join 
  ( select * from proplist where prop = 'Калорийность' ) pl on ( o.type_id = pl.type_id )
    left outer join 
  properties p on ( pl.id = properties.id )
order by
  to_number ( p.value ) desc nulls last

Заодно я бы посоветовал выбрать более толковую схему именования первичных и внешних ключей.

P.S. В очередной раз полюбуюсь на тех, кто расскажет об удобном и читабельном формате записи ansi join-ов :)
...
Рейтинг: 0 / 0
EAV сортировка
    #34430447
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем outer join? Поскольку Объект+свойство - уникальный ключ, достаточно group by .
...
Рейтинг: 0 / 0
EAV сортировка
    #34430505
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRЗачем outer join?
Чтобы не делать оговорки про то, в каких условиях достаточно group by, а в каких его недостаточно.
...
Рейтинг: 0 / 0
EAV сортировка
    #34430651
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не оговорка (дополнительное условие) - либо ModelRОбъект+свойство - уникальный ключ либо это не EAV. Впрочем, я кажется ломлюсь в открытую дверь:
softwarer Но как только появляется желание выполнить с атрибутом некую операцию "над многими записями", появляется подозрение, что EAV для этого атрибута была выбрана совершенно напрасно.Если у лопаты была одна ширина, то с чего бы ей размножиться чисто при транспонирвании?
...
Рейтинг: 0 / 0
EAV сортировка
    #34430887
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ModelRЭто не оговорка (дополнительное условие) - либо ModelRОбъект+свойство - уникальный ключ либо это не EAV.
Я не особо горю желанием выяснять, что именно Вы полагаете EAV. К процитированной Вашей фразе я не имею никаких возражений, но тем не менее в той структуре данных, которая нарисована топикстартером, запрос с group by не способен без дополнительной оговорки гарантировать соответствующее постановке решение задачи. Вы человек грамотный, и если зададитесь вопросом "в каком случае я не получу список всех трех объектов...." вне всякого сомнения, легко найдете ответ на него.
...
Рейтинг: 0 / 0
EAV сортировка
    #34431832
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer ModelRЭто не оговорка (дополнительное условие) - либо ModelRОбъект+свойство - уникальный ключ либо это не EAV.
Я не особо горю желанием выяснять, что именно Вы полагаете EAV. К процитированной Вашей фразе я не имею никаких возражений, но тем не менее в той структуре данных, которая нарисована топикстартером, запрос с group by не способен без дополнительной оговорки гарантировать соответствующее постановке решение задачи. Аналогично. Я довычислил ограничения целостности из контекста сообщения автора. Может и зря.
...
Рейтинг: 0 / 0
EAV сортировка
    #34435311
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarerВозможно все. Но как только появляется желание выполнить с атрибутом некую операцию "над многими записями", появляется подозрение, что EAV для этого атрибута была выбрана совершенно напрасно.

Наверное, Вы правы.

softwarer
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select 
  o.*
from 
  objects o 
    left outer join 
  ( select * from proplist where prop = 'Калорийность' ) pl on ( o.type_id = pl.type_id )
    left outer join 
  properties p on ( pl.id = properties.id )
order by
  to_number ( p.value ) desc nulls last

Заодно я бы посоветовал выбрать более толковую схему именования первичных и внешних ключей.


Спасибо.
Вы о замене objects.ID на objects.objectID, properties.OID на properties.objectID и т.п.?
...
Рейтинг: 0 / 0
EAV сортировка
    #34435313
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ModelRЗачем outer join? Поскольку Объект+свойство - уникальный ключ, достаточно group by .

Вы имеете в виду группировку в таблице properties?
В условии задачи не указано, что у каждого объекта обязательно есть хоть одна характеристика со значением. Поэтому возможна ситуация, когда у объекта нет никаких значений свойств в таблице properties, и в этом случае он по группировке в список не попадет.
Или я неправильно понял Ваше предложение?
...
Рейтинг: 0 / 0
EAV сортировка
    #34435608
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Вы имеете в виду группировку в таблице properties?
Да.
Если нет свойств - не попадет. А если и есть, то не попадет его TypeID и другие (если есть такие)поля из objects.
Легко ж допилить чтоб попало.
...
Рейтинг: 0 / 0
EAV сортировка
    #34435697
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fillipeВы о замене objects.ID на objects.objectID, properties.OID на properties.objectID и т.п.?
Не обязательно именно так, но просто некая очевидная и читаемая система. В том, что Вы написали, пришлось отдельно подумать "а какие связки здесь имеются в виду"; скажем, propID - это ссылка на proplist? А "интуитивно" - на properties.
...
Рейтинг: 0 / 0
EAV сортировка
    #34437125
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer fillipeВы о замене objects.ID на objects.objectID, properties.OID на properties.objectID и т.п.?
Не обязательно именно так, но просто некая очевидная и читаемая система. В том, что Вы написали, пришлось отдельно подумать "а какие связки здесь имеются в виду"; скажем, propID - это ссылка на proplist? А "интуитивно" - на properties.

Можете посоветовать какой-нибудь сборник best practices или нечто близкое этому?
...
Рейтинг: 0 / 0
EAV сортировка
    #34437165
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fillipeМожете посоветовать какой-нибудь сборник best practices или нечто близкое этому?
Этот вопрос столько раз обсуждался, что поиск даст Вам все возможные варианты. Могу приложить несколько устаревший регламент, который я писал на эту тему - нисколько не настаивая именно на нем, просто как образец для самостоятельного поиска.
...
Рейтинг: 0 / 0
EAV сортировка
    #34437375
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, еще хотел поинтересоваться, насколько целесообразно выделение значений (поле Value) из таблицы properties в отдельную таблицу. Это позволит иметь справочники для каждого параметра и сократит размер базы, но в какой степени это отразится на производительности?
...
Рейтинг: 0 / 0
EAV сортировка
    #34437380
fillipe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
softwarer fillipeМожете посоветовать какой-нибудь сборник best practices или нечто близкое этому?
Этот вопрос столько раз обсуждался, что поиск даст Вам все возможные варианты. Могу приложить несколько устаревший регламент, который я писал на эту тему - нисколько не настаивая именно на нем, просто как образец для самостоятельного поиска.

Спасибо
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / EAV сортировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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