wiele do wielu ?
afoka@poczta.onet.pl - 17-05-2006 00:41
wiele do wielu ?
Mam takie problem, chcialbym zrobic sklep internetowy i w zasadzie caly uklad juz mam tylko problem z przypisywaniem produktów do kategori. Otóz mam jakies drzewko kategorii i tabele z produktami, i chodzi mi o to aby jeden produkt mógl byc w kilku kategoriach np : ---telewizory ----Producenci ----- Sony --produkt1 --produkt2 // o ten produkt cala rzecz sie robija --produkt3 ----- Panasonic --produkt4 --produkt5 ----Ekran ----- LCD ---- 32 --produkt2 // o ten produkt cala rzecz sie rozbija --produkt10 --produkt11 ---- 28 ----- PLAZMA --- radia
itd. I moje pytanie brzmi , czy da sie z tym obejsc nie uzywajac trzeciej tabli typu : id_produktu | id_kategorii (stosowania relacji wiele do wielu)
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 17-05-2006 00:41
afoka@poczta.onet.pl wrote: > I moje pytanie brzmi , czy da sie z tym obejsc nie uzywajac > trzeciej tabli typu : id_produktu | id_kategorii (stosowania relacji > wiele do wielu) Po pierwsze, czemu z założenia wykluczasz najbardziej oczywiste rozwiązanie? Nudzi Ci się i chcesz za wszelką cenę wymyślić coś bardziej skomplikowanego? :->
Po drugie, zastanów się czy aby na pewno jest to struktura drzewiasta. Jeśli po prostu będziesz miał atrybuty produktu typu "id producenta", "przekątna ekranu", itp, to nie musisz robić żadnego mapowania, tylko po prostu będziesz wyświetlał produkty spełniające określone warunki.
-- Michał Kuratczyk
afoka@poczta.onet.pl - 17-05-2006 00:41
To drzewko które naryswałem to przykład, faktycznie może zamiast producenci mogłem wybrać jakąś bardziej trafną cechę np: dzwięk (dolby, stereo, etc) ogólnie jakas inną cechę której nie mam zdefinowanej przy produkcie.
A jak z wydajnością takiego rozwiązania, używam 4.1.19 więc o kluczach i zawansowanych opcjach baz danych nie ma mowy i wszystkie relacje musze organizować kodem ( PHP ). Dziękuje za odpowiedź . Pozdrawiam
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 17-05-2006 00:41
afoka@poczta.onet.pl wrote: > A jak z wydajnością takiego rozwiązania, To jest pytanie do Ciebie. Musisz określić jakie operacje będziesz najczęściej wykonywał, stworzyć schemat (albo fragment schematu), wrzucić dane testowe, napisać zapytania i sprawdzić. Natomiast nie ma wątpliwości, że relacyjne bazy danych powstały po to by wykonywać złączenia, więc jeśli będą problemy, to raczej nie będą wynikać z samego faktu istnienia dodatkowej tabeli łączącej dwie inne.
> używam 4.1.19 więc o kluczach i zawansowanych opcjach baz danych nie > ma mowy Po pierwsze możesz zrobić upgrade. Po drugie bez przesady - MySQL 4.1 ma parę zaawansowanych opcji, a klucze obce (jeśli je miałeś na myśli), to chyba jeszcze w 3.23 były.
> wszystkie relacje musze organizować kodem ( PHP ). Znaczy chcesz integralność danych zapewniać na poziomie PHP? Powodzenia...
-- Michał Kuratczyk
afoka@poczta.onet.pl - 17-05-2006 00:41
> relacyjne bazy danych powstaly po to by wykonywac zlaczenia, wiec jesli beda problemy, to raczej nie beda wynikac z samego faktu istnienia dodatkowej tabeli laczacej dwie inne.
Rozumiem z tego, ze jesli nie zrobie zadnych bledów strukturalnych i dobrze zaprojektuje wszystkie table i relacje to nie bedzie problemu
> Znaczy chcesz integralnosc danych zapewniac na poziomie PHP? Powodzenia...
Oczywiscie ze np do do wyciagania prduktów danej kateogori uzyje zlaczen , ale zakladajac, ze mój produkt posiada 15 cech (kazda to int) , a te z koleii sa przechodwywane w osobnych tabelach (np. producent, przekatna, dostawca, kolor itd....) to w celu wypisania rekordów lepiej jest zlaczyc te 15 tabel w jednym zapytaniu czy wyciagnac najpierw ten pietnascie tabel, wpisac je do jakis zmiennych (tablic) i potem uzyc przy wyswietlaniu (zakladam ze kazda z tych tabel ma do 20 rekordów) ??
Matt Z - 17-05-2006 00:41
Uzytkownik <afoka@poczta.onet.pl> napisal w wiadomosci news:1147792210.814236.82350@u72g2000cwu.googlegro ups.com... > lepiej jest zlaczyc te 15 tabel w jednym zapytaniu
tak
-- Matt Z - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SMSy za darmo i wygodnie? do wszystkich polskich sieci? ==> ESik www.esik.prv.pl sprawdz go
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 18-05-2006 00:16
afoka@poczta.onet.pl wrote: >> relacyjne bazy danych powstaly po to by wykonywac zlaczenia, wiec jesli > beda problemy, to raczej nie beda wynikac z samego faktu istnienia > dodatkowej tabeli laczacej dwie inne. > Rozumiem z tego, ze jesli nie zrobie zadnych bledów strukturalnych i > dobrze zaprojektuje wszystkie table i relacje to nie bedzie problemu Tak.
> lepiej jest zlaczyc te 15 tabel w jednym zapytaniu czy > wyciagnac najpierw ten pietnascie tabel, wpisac je do jakis > zmiennych (tablic) i potem uzyc przy wyswietlaniu Zdecydowanie złączyć. Zastanów się tylko czy faktycznie potrzebujesz do tego 15 tabel, ale nawet jeśli tak, to lepiej będzie je złączać niż robić ręcznie to, do czego bazy danych zostały stworzone. Lepiej wykonać jedno bardziej złożone zapytanie niż 16 prostszych.
-- Michał Kuratczyk
afoka@poczta.onet.pl - 18-05-2006 00:16
Super. Dziękuje bardzo za wyczerpującą odpowiedź.
Pozostaje mi jeszcze jedna kwestia : w uprosczeniu, mam dwie przykładowe tabele :
t_towar id_towar | id_producent | nazwa
oraz t_producent id_producent | nazwa
korzystając z MySQL 4.1, który owszem obsługuje klucze obce) ale tylko teoretycznie bo oprócz ich definiowania nie można wykonywać żadnych operacji przy ich użyciu, mam tu na myśli np kaskadowe kasowania tzn jesli kasuje producenta to sam musze zatroszczyc sie o skasowanie jego produktów ? Czy mam racje?
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 18-05-2006 00:16
afoka@poczta.onet.pl wrote: > korzystając z MySQL 4.1, który owszem obsługuje klucze obce) ale > tylko teoretycznie bo oprócz ich definiowania nie można wykonywać > żadnych operacji przy ich użyciu, mam tu na myśli np kaskadowe > kasowania tzn jesli kasuje producenta to sam musze zatroszczyc sie o > skasowanie jego produktów ? > Czy mam racje? Rozwiązanie jest proste - nie usuwaj danych. :-) W tabelach PRODUKTY i PRODUCENCI dodajesz po prostu kolumnę "usunięty" i w większości operacji zawsze dodajesz warunek ignorowania usuniętych rekordów (lub tworzysz sobie widoki i z nich korzystasz).
Usuwanie danych z bazy jest generalnie złym pomysłem - uniomożliwia na przykład tworzenie historycznych raportów, funkcji business intelligence, itp. Trzy razy się zastanów zanim użyjesz DELETE. A jeśli brakuje Ci miejsca, albo baza działa za wolno z dużą ilością danych i nie potrafisz tego poprawić, to zamiast usuwać - przerzucaj je gdzieś indziej (zrób coś w stylu hurotwni danych, którą potem będziesz mógł rozwinąć w prawdziwą hurtownię danych).
Jeśli natomiast upierasz się przy usuwaniu, to:
http://dev.mysql.com/doc/refman/4.1/...nstraints.html
CASCADE: Delete or update the row from the parent table and automatically delete or update the matching rows in the child table. ON DELETE CASCADE is supported starting from MySQL 3.23.50 and ON UPDATE CASCADE is supported starting from 4.0.8. Between two tables, you should not define several ON UPDATE CASCADE clauses that act on the same column in the parent table or in the child table.
-- Michał Kuratczyk
afoka@poczta.onet.pl - 18-05-2006 00:16
Hm ciekawe.
Przeczytalem ten artykul i sprwdzilem przyklad, róznica jaka jaka zauwazylem to typ moje tabele sa MyISAM a ta z przykladu to InnoDB. Domyslam sie, ze przez moja niewiedze stracilem duzo z funkcjonalnosci mysql'a. Jaka jest róznica pomiedzy tymi typami ?
=?UTF-8?B?UGF3ZcWCIE1hdGVqc2tp?= - 18-05-2006 00:16
afoka@poczta.onet.pl wrote: > Hm ciekawe. > > Przeczytalem ten artykul i sprwdzilem przyklad, róznica jaka jaka > zauwazylem to typ moje tabele sa MyISAM a ta z przykladu to InnoDB. > Domyslam sie, ze przez moja niewiedze stracilem duzo z > funkcjonalnosci mysql'a. Jaka jest róznica pomiedzy tymi typami ?
Szybkość.
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Jak wybrac wiele elementow powiazanych z jednym elementem innej tablicy?
=?ISO-8859-2?Q?[MS_SQL]_update_wielu_p=F3l_na_raz_z_selecta?=
[MySQL]: Odzyskanie z pliku zawierającego wiele baz danych tylko jednej wybranej bazy
Export z wielu baz do jednej-MySql jakie narzędzie?
=?iso-8859-2?q?miejsca_w_Internecie,_gdzie_jest_wielu_grafik= F3w_:)?=
[mysql 5] dodanie wielu rekordow po stronie bazy
2 tabele w relacji 1 do wielu - tylko jeden wiersz
dynamiczny sql - pobieranie danych z wielu tabel
[MS SQL] count distinct na wielu kolumnach
select dane z wielu dni z jednej godziny
zanotowane.pldoc.pisz.plpdf.pisz.plmarcelq.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|