Jestem kuriozalny budując sklep internetowy. Ten sklep pozwala użytkownikom filtrować produkty category
, a kilka opcjonalne, dodatkowe filtry takie jak brand
, color
itpPHP, MySQL, efektywny algorytm wyszukiwania oparty na tagach.
Obecnie różne właściwości są przechowywane w różnych miejscach, ale chciałbym, aby przełączyć się na system oparty na tagach. Idealnie, moja baza danych powinna przechowywać tagi z następującymi danymi:
product_id
tag_url_alias
(unikalne)tag_type
(unikalny) (kategoria, product_brand, product_color, etc.)tag_value
(nie wyjątkowa)
Pierwszy cel
Chcę wyszukać product_id
, które są powiązane z dowolnym miejscem między 1-5 znacznikami specjalnymi. Tagi są pobierane z przyjaznego SEO adresu URL. Będę więc pobierać unikalne ciągi znaków (tag_url_alias
) dla każdego tagu, ale nie będę znać tag_type
. Wyszukiwanie będzie skrzyżowanie, więc moje poszukiwania powinny powrócić do „S product_id
które odpowiadają wszystkie dostarczonego tags
.
Drugi cel
Oprócz wyświetlania produktów, które odpowiadają aktualnej filtr, chciałbym również, aby wyświetlić produktów odliczanie do innych kategorii i filtrów, które mogą dostarczać użytkownikowi.
Na przykład, mój obecny wyszukiwania jest dla produktów pasujących tagi:
Shoe + Black + Adidas
Teraz użytkownik sklepu może być patrząc na otrzymanych produktów i zastanawiam się który czarne buty inne marki mają do zaoferowania. Mogą więc przejść do filtra "marki" i wybrać dowolną z pozostałych wymienionych marek. Powiedzmy, że mają 2 różne opcje (w praktyce będzie to prawdopodobnie mają o wiele więcej), w wyniku następujących wyszukiwań:
Shoe + Black + Nike > 103 results
Shoe + Black + K-swiss > 0 results
w tym przypadku, jeśli widzą markę „K-Swiss” na liście dostępnych wybierz w swoim filtrze, ich wyszukiwanie zwróci 0 wyników.
To oczywiście raczej rozczarowuje użytkownika ... Wolę wiedzieć, że zmiana "marki" z "adidas" na "k-swiss" spowoduje wyświetlenie 0 wyników, a po prostu usunięcie całej opcji z filtra .
samo odnosi się do kategorii, kolorów itp
W praktyce oznaczałoby to pojedynczy widok strony nie tylko powrót do listy produktów przefiltrowaną opisanej w moim głównym celem, ale potencjalnie setki podobnych jeszcze różnych listach. Jedna dla każdej wartości filtru, która może zastąpić inną wartość filtru lub być dodana do istniejących wartości filtru.
Pojemność
Podejrzewam moja baza danych będzie zawierać ewentualnie:
między 250 a 1.000 unikalne znaczniki
I będzie zawierać:
pomiędzy 10.000 a 100.000 wyjątkowe produkty
Aktualne Pomysły
Zrobiłem kilka wyszukiwania Google i znalazłem następujący artykuł: http://www.pui.ch/phred/archives/2005/06/tagsystems-performance-tests.html
Sądząc po tym artykule, bieganie setki zapytań do osiągnięcia 2nd cel, będzie boleśnie powolne trasy. Przykład "toxy" może działać dla moich potrzeb i może być do przyjęcia dla mojego pierwszego celu, ale byłby niedopuszczalnie powolny dla drugiego celu.
Myślałem, że mogę uruchomić pojedyncze zapytania pasujące do 1 tag
do skojarzonych z nimi product_id
, buforować te zapytania, a następnie obliczyć skrzyżowania wyników. Ale czy mogę obliczyć te przecięcia w MySQL? lub w PHP? Jeśli używam MySQL, czy istnieje szczególny sposób, w jaki powinienem buforować te indywidualne zapytania lub czy dostarczam właściwe indeksy, których potrzebuję?
Wyobrażam sobie, że możliwe jest nawet, że może nawet buforować skrzyżowania między dwoma z tych zestawów tag
/product_id
. Ilość skrzyżowań byłaby ograniczona przez fakt, że tag_type
może mieć tylko jedną konkretną wartość, ale nie jestem pewien, jak skutecznie zarządzać tego typu buforowaniem. Ponownie, nie wiem, czy powinienem to zrobić w MySQL lub w PHP. A jeśli zrobię to w MySQL, jaki byłby najlepszy sposób przechowywania i łączenia tego typu wyników w pamięci podręcznej?
to jest teza: D – dynamic
Cóż, to jest to, co nazywam pytaniem! Gratulacje, proszę pana. – Weacked
Dziękujemy! Założę się, że odpowiedzi dostarczą mnóstwa nowej wiedzy! –