eh, silniki relacyjnych baz danych naprawdę dobrze sobie radzą z relacjami

o ile oczywiście prawidłowo porobisz złączenia. kwestia operacji jakie będą wykonywane na tej bazie. być może właśnie pracujesz nad przyszłym bólem głowy
hm. co do cech..
a co w przypadku jeśli będziesz chciał dodać kolejną cechę ? będziesz dodawał kolejną tabelę? bez sensu.
ja raczej bym stawiał na tabelę (jeśli naprawdę potrzebujesz znać typ tej cechy):
offer_features
feature_id | offer_id | value | typ_cechy_fk
****
tak naprawdę wydaje mi sie ze to i tak nie jest najlepszym rozwiązaniem...
ja, tak naprawdę wyodrębniłbym cechy wspólne dla wszystkich ogłoszeń (np data, miejscowość itp..) do jednej tabeli.
w tej tabelce koniecznie umieściłbym wszystkie pola po których bym przewidywał sortowanie.
pozostałe cechy, które nie są standardowe - trzymałbym w dodatkowej tabeli - ale nie dawałbym możliwości sortowania po nich.
projektując ta tabele - zgodnie z normalizacja i optymalizacja, starałbym się unikać pol zmiennej długości, np.: zamiast nazwy miejscowości - FK do tabeli z słownikiem miejscowości.
pamiętaj, że pierwszym przykazaniem optymalizacji jest stała długość WSZYSTKICH pól, oraz minimalna długość danych. i to jest chyba cel ku któremu powinieneś dążyć.
zachowanie maksymalnej unikatowości - także jest jest jedną z ważniejszych cech.
jeśli zrobisz do tego prawidłowe indexy - będzie śmigać, i to o wiele lepiej niż jeden wielki worek w którym masz wszystko.... wszystko i nic.
j.
PS ale do tego normalizacja jest potrzebna :] wyobraź sobie zliczanie counta dla nieznormalizowanej tabeli.... tożto koszmar