2012-07-02 3 views
1

Я хотел бы напечатать список элементов из таблицы базы данных и вместе с каждым небольшим списком (10 элементов max) связанных подэлементов.Получение связанных данных в списке

К примеру, у меня есть эти 2 таблицы:

ITEMS 

id: integer 
name: string 


SUBITEMS 

id: integer 
name: string 
item_id: integer 

Таким образом, элемент может иметь много подразделов.

Я хотел бы напечатать что-то вроде этого:

Item 1 
this item has: subitem 1, subitem 2, subitem 3 

Item 2 
this item has: subitem 4, subitem 5, subitem 6 

Item 3 
this item has: subitem 2, subitem 4, subitem 7 

Как я мог получить это с исполнением в виду? Как я уже сказал, у каждого элемента может быть много подэлементов, но я буду показывать максимум 10.

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

Я подумал об обходном пути, что-то грязное: добавив новое поле в таблицу ITEMS с именем subitems_summary (типа текста), и каждый раз, когда подтип присваивается элементу, я делаю выбор, чтобы присоединиться к двум таблицы и сохранить там результаты, поэтому я могу позже форматировать данные из этого поля. Например, в приведенном выше листинге поле subitems_summary для элемента 3 будет: «подпункт 2, подпункт 4, подпункт 7».

Как вы думаете?

+0

Рассмотрим, что ваш «грязный обходной путь» не только для выполнения выбора, но и вставки, обновления и удаления для отдельных подпозиций. –

+0

Я бы использовал 'select *' и просто перебирал набор результатов и печатал ненулевые значения – alfasin

ответ

0

Поскольку я не получаю больше ответов, я опубликую свое мнение.

Как говорит Олекси, СУБД достаточно хороша, чтобы запускать объединенные запросы. Это может быть верно при небольшом количестве посетителей. Но следя за масштабированием, это не было бы оптимизированным способом выполнения сложных задач.

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

Во всяком случае, добиться того, что я просил, я бы сделал это: https://stackoverflow.com/a/11301759/267705

0

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

Ваша СУБД обычно очень хороша в оптимизации таких запросов, поэтому вы должны увидеть, как быстро она может сделать запрос первым, прежде чем встраиваться в пользовательскую оптимизацию.

+0

Ну, я думаю, что мне не нужно получить, если я не использую подзапросы. И это еще более требовательно. –

Смежные вопросы