2013-03-27 2 views
0

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


Моя stucture база данных в настоящее время следующим образом

PAGE: 
    id 
    title 
    content 

-

ATTRIBUTE: 
    id 
    page_id 
    name 
    value 

-

LINK: 
    id 
    title 

-

PAGE_LINK: 
    page_id 
    link_id 

Так сказать, у меня был рецепт Страница под названием 'Mash Картофель' и ингредиенты Page называется 'Картофельный', которые содержатся в Ссылка'Картофельная ссылка'. 'Mash Картофель' имеет следующие Атрибуты - Питание: Обед, Flavor: чабер, Сложность: Легкая, И 'Картофель' имеет Атрибуты - Сезон: Осень, Цена: Дешевые.

Я хочу, чтобы быть в состоянии найти ссылку, которая Дешево, чабер и в сезон осенью и получить взамен «Картофельный Link».


Как написать этот запрос в SQL и является ли это лучшей структурой базы данных для запроса чего-то подобного?

+1

если 'PAGE' к 'LINK' является' один-к-one' (= 'LINK' не разделяют разные' PAGE's), то вы должны вставлять 'page_id' в' LINK таблицу. – yair

+1

Что значит 'LINK.title'? Это ссылка на «PAGE.title»? Если это так, то его лучше заменить на 'LINK.referred_page_id'. И тогда есть * действительно * не нужно для таблицы 'LINK' 'и *' PAGE_LINK'. Используйте одну таблицу LINK с полями '{id, referring_page_id, refer_page_id}'. Если вы одобряете мои комментарии, я могу дать ответ с соответствующим SQL-запросом. – yair

+0

Возможно, «Link» не было лучшим именем для таблицы. «Ссылка» - это сборник «Страницы», все связанные друг с другом. «Страница» может иметь много ссылок, а «Ссылка» содержит много «страниц». 'Link.title' - это имя/название« Ссылка », а не« Страница ». –

ответ

1

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

Select Page.ID 
From Page 
where EXISTS 
(Select * 
    From Attributes 
    Where Page_Id = Page.ID 
    and ( (Name = 'Season' and Value = 'Autumn') 
      or (Name = 'Flavour' and Value = 'Savory') 
      ... etc. ... 
     ) 

Если вы хотите, чтобы найти ссылки, то вы можете присоединиться к этой PAGE_LINK (и даже LINK, если вам нравится).

Select Page.ID 
From Page 
Join Page_Link PL on PL.Page_ID = Page.ID 
Join Link on Link.ID = PL.Link_ID 
where EXISTS 
(Select * 
    From Attributes 
    Where Page_Id = Page.ID 
    and ( (Name = 'Season' and Value = 'Autumn') 
      or (Name = 'Flavour' and Value = 'Savory') 
      ... etc. ... 
     ) 
Смежные вопросы