zmienna lista “cech”

przy wielu projektach pojawia się potrzeba przechowywania zmiennej listy “cech" jakichś obiektów.

weźmy na przykład sklep internetowy: mamy jakieś tam kategorie (struktura drzewiasta, moja ulubiona 🙂 ), w nich produkty. każdy produkt ma pewne cechy stałe – cena, tytuł, opis. natomiast produkty w określonych kategoriach mają swoje własne cechy dodatkowe.

np. dla samochodów możemy chcieć przechowywać:

  • ilość drzwi
  • pojemność silnika
  • typ paliwa
  • rodzaj skrzyni biegów

z drugiej strony, ogłoszenia w kategorii komputery będą miały pola takie jak:

  • ilość pamięci
  • wielkość dysku
  • typ procesora

najprostszym rozwiązaniem jest trzymanie produktów w każdej kategorii w oddzielnej tabelce – gdzie każda z tych tabelek ma różną strukturę (inna lista pól).

jest to rozwiązanie nieakceptowalne – osobiście uważam, że jakiekolwiek rozwiązanie zakładające modyfikacje struktury bazy danych w trakcie normalnego użytkowania jest błędne.

inną metodą jest zrobienie sobie tabelki typu:

 CREATE TABLE zmienne_cechy (
id         SERIAL PRIMARY KEY,
produkt_id INT  NOT NULL REFERENCES produkty(id),
cecha1     TEXT,
cecha2     TEXT,
cecha3     TEXT,
cecha4     TEXT,
...
);

i pilnowanie, że dla danego produktu kolumna cecha1 oznacza pojemność silnika, a dla innego jest to ilość pamięci.

takie rozwiązanie ma swoje zalety – najważniejszą jest to, że aby wyciągnąć informacje o wszystkich polach dla danego produktu wystarczy pobrać jeden rekord z bazy.

ale dopóki nie obsługujesz miliona page-views dziennie w swoim sklepie – ten problem jest mało istotny 🙂

zdecydowanie najskuteczniejszą metodą jest tabelka:

 CREATE TABLE zmienne_cechy (
id         SERIAL PRIMARY KEY,
produkt_id INT  NOT NULL REFERENCES produkty(id),
cecha      TEXT,
wartosc    TEXT
);

taka tabelka w jednej prostej strukturze pozwala na zapisanie wszystkich mozliwych cech i łatwe wyszukiwanie. no właśnie. czy na pewno łatwe?

tabelka pokazana taka jak tu – jest może i fajna, ale brakuje jej jeszcze jednej rzeczy:

create unique index ui_zmienne_cechy_pic on zmienne_cechy (produkt_id, cecha);

jeśli nie czytacie sql'i ze 100% zrozumieniem, to powyższe powoduje, że dany produkt może mieć tylko jedną wartość danej cechy. może mieć dowolnie wiele cech, ale żadna z cech nie może mieć wielu wartości.

zazwyczaj takie ograniczenie w niczym nie przeszkadza. zdarzają się czasem (ale bardzo rzadko) sytuacje, że istnieje potrzeba wielu wartości jednej cechy – sugeruję by wtedy nie kasować tego indeksu/klucza unikalnego tylko po prostu użyć ciut innych cech.

czemu?

otóż taka tabelka z pokazanym kluczem unikalnym pozwala nam w trywialny sposób zrobienie tego co bez klucza jest dużo trudniejsze (zasobochłonne): znalezienia produktów w/g kilku cech jednocześnie.

załóżmy, że chcemy znaleźć samochody o pojemności silnika 2000 z automatyczną skrzynią biegów.

bez klucza unikalnego jesteśmy skazani na coś takiego:

 SELECT zc1.produkt_id
FROM zmienne_cechy zc1 JOIN zmienne_cechy zc2 ON zc1.produkt_id = zc2.produkt_id
WHERE zc1.cecha='pojemnosc silnika' AND zc1.wartosc = '2000' AND zc2.cecha = 'skrzynia biegow' AND zc2.wartosc = 'automat';

nie jest to oczywiście takie złe. ale przy dużej ilości produktów stanie się problematyczne. nie mówiąc o tym jak będziemy chcieli sprawdzić produkty w/g np. 5 cech na raz. 5 joinów? jeśli w bazie jest np. 1000 produktów i każdy ma średnio 10 cech, to łączymy 5 razy ze sobą tabelę o 50000 rekordów. i szukamy na nich wszystkich. mało przyjemne.

dodanie wspomnianego wyżej klucza unikalnego pozwala na użycie w naszym select'cie rzadko używanej (i słabo znanej) klauzuli HAVING:

 SELECT produkt_id
FROM zmienne_cechy
WHERE
(cecha='pojemnosc silnika' AND wartosc='2000')
OR
(cecha='skrzynia biegow' AND wartosc = 'automat')
GROUP BY produkt_id
HAVING COUNT(*) = 2;

powstałe zapytanie ma kilka zalet:

  • jest trywialnie rozbudowywalne o kolejne cechy – bez konieczności dodatkowych joinów = wystarczy dodać dodatkowe warunki i podbić wartość w klauzuli having
  • jeśli używamy postgresql'a 8.1 i mamy dodatkowo indeks dwupoowy na (cecha, wartosc), to postgresql uzyje bardzo szybkich bitmap-or'ów

moje testy wykazały, że na postgresie 8.1 obie metody dają bardzo podobne wyniki (chodzi o czas zapytania) jeśli szukamy dwóch cech, natomiast już od 3 przewaga rozwiązania z having jest olbrzymia.

pociąga cię nauka? masz niestandardowe pomysły? a może chciałbyś na tym zarabiać?

mam prenumeratę takiego pisma: wired. w ostatnim numerze jest artykuł nt. crowdsourcingu.

w dużym skrócie – chodzi o zlecanie prac/zadań do wykonania ogółowi ludzi – w jakiś publiczny sposób. na zasadzie – zrobisz, dostaniesz kasę. bez umów i takich tam.

jednym z “działów" tego typu działalności jest (co mnie trochę zszokowało) r&d (research & development) w dużych firmach (procter & gamble, boeing, dupont).

powstał serwis gdzie biorące udział firmy publikują zadania – można je przejrzeć bez żadnej rejestracji – otwarte dla każdego.

za wykonanie jest kasa. i to całkiem spora.

np. teraz jest zadanie za $50000 (CATALYST SYSTEM FOR THE SYNTHESIS OF A MONORESORCINYL-TRIAZINE, cokolwiek by to nie znaczyło).

serwis zasadniczo tyczy się chemii i biologii, ale nie jest wymagane żadne doświadczenie. w artykule czytałem wręcz, że najlepsze rezultaty osiągają ludzie którzy nie mieli żadnego wykształcenia w danym kierunku, tylko po prostu mają szerokie zainteresowania.

dodatkowo – mimo, że zadanie jest np. “chemiczne" nie oznacza, że trzeba je chemicznie rozwiązać. np. jedno z zadań zostało wykonane przez odpowiednie doprowadzenie energii elektrycznej i uziemienia.

oczywiście nie każdy da radę się zmieżyć z problemami tam opisanymi. ale może warto spojrzeć i w wolnej chwili się zastanowić?

clerks (sprzedawcy) – część druga

firmy kevina smitha można kochać lub nienawidzieć.

należę do tych którzy je uwielbiają. podobał mi się nawet mallrats (za który kevin przeprosił fanów) i ostatni, mocno przesadzony jay i milczący bob kontratakują.

po tych 5 specyficznych filmach, kevin nakręcił jersey girl – zupełnie inny film, dużo bardziej stonowany, ale i tak z kilkoma charakterystycznymi dla jego filmów tekstami.

teraz – wrócił do korzeni – nakręcił kontynuację hitu sprzed lat – sprzedawców.

nie zdradzając fabuły – są i dante, i randal i para charakterystycznych dealerów 🙂 i teksty. fenomenalne (bazuję na tym co w trailerze, filmu jeszcze nie widziałem). po pokazie w cannes film dostał 8 minutową owację na stojąco. kiedy w polsce?

jak wysłać maila z aplikacji .net ?

na serwisie thedailywtf.com pojawił się taki post. rozbawił mnie maksymalnie:

If you were to say “programmatically send an email in .NET" to a .NET programmer, he'd almost immediately reply “SmtpMail class in System.Web.Mail." A less experienced .NET programmer might take a moment to search the documentation, and then reply “SmtpMail class in System.Web.Mail." Someone with absolutely no .NET programming experience would take a few minutes on Google, and then reply “SmtpMail class in System.Web.Mail."
When Maxim Rouiller's predecessor (the company's former .NET whiz) was presented with the requirement to “programmatically send an email in .NET," he used a slightly different approach. With the change log and source control history, Maxim was able to reconstruct the trials and tribulations he must have gone through to finally master this requirement.

  • 2004-12-02 13:29 — Check in code that does the following: Programmatically execute outlook.exe and wait five seconds for it to load up. With the outlook process in the foreground, send the following keystroke combination to outlook: {ctrl+n}, theUser@theDoma.com, {tab}, {tab}, Some Subject Line, {tab}, The Message Body, {ctrl+enter}.Close the outlook process.
  • 2004-12-02 14:07 — Deploy to the server and learn that it doesn't work so well. Go back to the drawing board.
  • 2004-12-03 11:18 — Check-in a custom email class that wraps around the CDONTS library.
  • 2004-12-03 12:39 — Deploy to the server and learn that, because it is Windows 2003, it does not have CDONTS installed. Go back to the drawing board
  • 2004-12-06 13:36 — Check-in another custom email class that interops the Microsoft Outlook automation objects.
  • 2004-12-06 13:51 — Deploy to the server and learn that Outlook has an anti-hijacking feature that requires the user to click “Yes" to send an email. Learn that, as a web application, the web user is not presented with a dialog window that pops-up on the server.
  • 2004-12-07 07:18 — Check-in an attempt to automatically click yes.
  • 2004-12-07 09:03 — Check-in another attempt to automatically click yes.
  • 2004-12-07 10:28 — Check-in yet another attempt to automatically click yes.
  • 2004-12-07 16:22 — Install, on the server, a newly purchased program called ClickYes that automatically clicks “Yes" to those dialogs.

Maxim took it upon himself to improve this process. After a few minutes, he had checked in a new approach: the SmtpMail class in System.Web.Mail.

modyfikowane genetycznie koty dla alergików

firma allerca ma dosyć nietypowy profil biznesowy. tworzy (rozmnaża? produkuje?) modyfikowane genetycznie zwierzęta pozbawione cech alergogennych.

pierwszym takim zwierzakiem jest hipoalegriczny kot – który nie powoduje reakcji alergicznych u osób uczulonych na sierść kota. oczywiśćie jak ktoś poza sierścią jest uczulony na coś jeszcze – jemu takiego kota nie można polecić, ale dla sporej części alergików to może być plus.

znam ludzi którzy chcieliby mieć zwierzątko w domu, ale nie mogą ze względu na alergie. ilość ludzi z alergiami coraz bardziej rośnie, więc można założożyć, że allerca ma przyszłość przed sobą. o ile oczywiście rynek zaakceptuje.

cena za kotka – $7000 ($4000 w/g innego źródła) nie jest niska, ale firma gwarantuje zwrot pieniędzy jeśli u właścicieli pokażą się objawy alergiczne.

czy to jeszcze laptop?

acer zademonstrował nowego laptopa. z monitorem o wielkości 20 cali!

w środku 256 mega ramu dla grafiki (nvidia 7600), hd-dvd, bluetooth, wbudowana kamerka 1.3 megapixela i 2 dyski 120G spięte w raid.

potwór waży coś koło 8-9 kilogramów. ceny nie podano (może i dobrze).

po co kupować taki sprzęt? tego nie da się nosić ze sobą… a może się da?

głośna muzyka – niecodzienne zastosowanie

pewnie wiele razy słyszeliście przejeżdżający samochód z którego dudnił jakiś hiphop czy disco.

ludzie tym jeżdżący znani są ze specyficznego stylu i zamiłowania do rozmaitych sportów.

w australii znaleziono inne zastosowanie (niż pokazanie otaczającym swojego super gustu muzycznego) głośno puszczanej muzyki.

używa się jej do … odstraszania huliganów 🙂

z głośników usytuowanych w centrach handlowych puszczają binga crosby'ego, a przy parkingach gdzie często zbierają się grupki ichniejszych dresów, puszczają głośno barry'ego manilowa na zmianę z klasyką. i okazuje się, że to jest skuteczne.

może i u nas by takie coś zrobić?

mily gest gwiazd

pewnie wiekszosc z was zna aktorow: brada pitta i angeline jolie.
ci z was ktorzy czasem czytuja dzialy z ploteczkami moze wiedza, ze para wlasnie doczekala sie coreczki.
na miejsce urodzin wybrali namibie – nie mam pojecia czemu, ale tak im sie wylosowalo. dziewczynka sie urodzila, cala zdrowa i ogolnie jest fajnie (przy okazji: w badaniach opinii w namibii 47% ludzi stwierdzilo, ze dzien urodzin corki gwiazdorskiej pary powinien odtad byc u nich swietem narodowym).

coz wiec za mily gest? dziecko takiej pary jest na swiecie lakomym kaskiem dla paparazzich i ogolnie pewnego typu pism.

wiedzac o tym, rodzice postanowili nie bawic sie w podchody z fotografami tylko po prostu sprzedac prawa do publikacji pierwszych zdjec dziecka. zostala zorganizowana aukcja, gdzie w ciagu 8 godzin miano wylicytowac najwyzsza kwote.

aukcja sie zakonczyla zgodnie z planem o 6 rano, z koncowa kwota 4.1 milona dolarow od pisma “people". cala ta kwota zostala wplacona na rzecz walki ze smiertelnoscia dzieci w afryce, gdyz jak powiedziala angelina – maja swiadomosc, ze ich zdrowe dziecko to jedno, a fakt, ze w afryce 2miliony dzieci umiera w ciagu pierwszego dnia po porodzie, to zupelnie inna sprawa.

wiem, ze czesc ludzi powie, ze mogli dac wiecej, nie musieli tyle szumu kolo siebie robic, i w ogole “zrobili to tylko pod publiczke". moze i tak, ale wole patrzec na to tak, ze popularnosc juz maja, rozglos byl pochodna ich slawy (i przy okazji podbil cene), a co do ilosci kasy – tym jednym ruchem dali na cele charytatywne wiecej niz wiekszosc anty- da przez cale zycie.