![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam, zastanawia mnie jak powinna wyglądać struktura tabel do sklepu.
Proszę o info czy mój pomysł jest OK Product *ID *name *desc *category Category *ID *name Order *User_id *adress *starus Order_has_product *order_id *product_id *amount Ten post edytował mimol 7.01.2013, 18:55:11 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
jeszcze jakies 300 tabel ci brakuje. (no moze z 300 przesadziłęm, ale ze sto to na pewno)
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Do pewnego momentu Ci wystarczy. Jaki to moment? Gdy nadejdzie zmiana ceny produktu. Skąd wtedy będziesz wiedział jaki produkt kiedy miał jaką cenę, skoro cena zapewne będzie przypisana do produktu lub po prostu jego atrybutem, tak jak desc lub name? Poza tym... Każdy produkt, choćby jeden, to osobne zamówienie? A co jeśli ktoś do "koszyka" wrzucił kilka rzeczy? Policzysz kilka razy koszt wysyłki? Pomyśl nad tym i co konkretnie ten system ma oferować i jak działać. Nie zaczynaj od struktury tabel, tylko od funkcjonalności i niejako tego, co widzi użytkownik. To przełóż na obiekty i dopiero wtedy myśl o przełożeniu na tabele.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Skąd wtedy będziesz wiedział jaki produkt kiedy miał jaką cenę, skoro cena zapewne będzie przypisana do produktu Hmm no jak dam edycje produktu to będę wdział ostatnią cenę. Tabeli mam oczywiście więcej, bardziej chodziło mi w temacie jak rozwiązać problem z koszykiem produktów. Cytat Każdy produkt, choćby jeden, to osobne zamówienie? No tak myślałem. Np w Order będzie zapisany adres do wysyłki. W Order_has_product np 1 2 1 1 3 2 Czyli nr zamówienia w którym jest produkt nr 2 i dwa produkty nr 3. Nie wiem czy to dobry pomysł więc pytam się na forum... Nie potrafię nic bardziej sensownego wymyślić, więc proszę o jakieś podpowiedzi |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
A będziesz wiedział jaka była cena produktu 2 miesiące temu? Może już zdążyła nastąpić jej edycja 5 razy?
![]() ![]() Masz do zapamiętania kilka rzeczy dla każdego produktu w koszyku: produkt, cenę (brutto lub netto do wyboru), vat, ilość produktów. Czemu? Jeśli ktoś będzie kupował, może chcieć się rozliczyć na innych warunkach, jak choćby faktura VAT dla firm. Stąd cena i podatek powinny być osobno. Dane te mogą być inne nawet każdego dnia, jeśli pozwolisz klientom edytować ceny produktów/usług w systemie. Będziesz pamiętał jaka cena była tego a tego dnia, lub jaki rabat danej osobie konkretnego dnia przysługiwał? Po kilku godzinach byś się pogubił ![]() Najczęściej w chwili obecnej chyba spotykanym rozwiązaniem jest zapis zserializowanej zawartości koszyka, gdzie poszczególne elementy to produkty z niezbędnymi parametrami, które po deserializacji można wykorzystać do pobrania z bazy brakujących, ale niezmiennych rzeczy, jak choćby identyfikator oferty/przedmiotu. Oczywiście jak podejdziesz do aplikacji sklepu nie wiem osobiście. Dałem Ci jedynie do przemyślenia fakt, że czasem nie zauważa się rzeczy i należy spojrzeć na problem bardziej ogólnie niż tylko z poziomu struktury tabel. Nie za bardzo przyjrzałeś się problematyce i samemu zagadnieniu. Gdybym ja miał iść po najmniejszej linii oporu, tabela miała by postać mniej więcej w stylu: id_zamówienia, id_usera, data_transakcji, zawartość_koszyka. Czym jest ta zawartość? To zserializowana tablica, przechowująca jako elementy tablice atrybutów pokroju: id_produktu, cena, podatek, ilość, ewentualny rabat. Dodatkowo w przypadkach niektórych, sama tablica może mieć osobno jeszcze wydzielone rabaty na elementy powiązane, bo i takie rabaty się zdarzają. Masz naprawdę trochę do przemyślenia struktury i powiązań ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
dzięki za odpowiedź.
Hmm chciałem aby to było w miarę proste, ponieważ chcę sobie napisać coś co wygląda jak sklep (taki projekt sam dla siebie / być może coś czy mógłbym się pochwalić)... więc nie zależy mi na tym, aby były zapamiętane ceny itd.... Tylko na razie żeby działało.... Potem będę zastanawiał się nad szczegółami Nigdy nie bawiłem się jeszcze w serializacje... więc szczerze nie wiem jak się za to zabrać... (Słyszałem, że jest to zapisywanie obiektu... Jak sobie z tym radzić w SF2)? Też chciałbym się dowiedzieć co zrobić z anonimowymi użytkownikami (takimi którzy nie posiadają konta), co mam zapisywać w bazie?? Czy może wszystko zapisywać w sesji?... a może zawsze mieć wszytko w sesji a dopiero na sam koniec podczas składania zamówienia (ostatni krok) zapisać to w bazie? |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Serializacja to konwersja obiektów do stringa w taki sposób, by była mozliwe jego ponowne odtworzenie. Tu nie ma wiele zabawy, gdyż są do tego gotowe metody w php. Co do symfony2 to ona też ma do tego wbudowane mechanizmy poprzez adnotacje choćby czy serializery. Tu raczej więc nie ma większych problemów. Co do anonimowych uzytkowników, można zrobić to choćby tak, ze po wejściu do sklepu nie robisz nic, ale każdy użytkownik ma sesję i dostęp do koszyka. Może w każdej chwili zalogować, ale nie jest to konieczne dla procesu wybierania. Gdy dochodzi do procesu zakupu możesz rozwiązać to na kilka sposobów. Możesz zaproponować jedno z kilku rozwiązań, ale sprowadzają się one do tak naprawdę 4 przypadków:
- prosisz użytkonika o zalogowanie jeśli ma konto, - proponujesz założenie konta, - zakładasz konto niejawnie lub o krótkim czasie ważności, - pozwalasz na podanie danych do wysyłki. Gdy tworzysz jakiekolwiek konto - nie ma problemu. Możesz przykładowo ograniczyć liczbę pól wymaganych by po prostu walidacja takiego konta przeszła (validation groups się kłaniają). Gdy pozwalasz na wysyłke bez tworzenia konta, musisz mieć możliwość zachowania danych do wysyłki w innej postaci. Własnie tutaj można zrobić sobie zadanie "od końca". Transakcje moga być zrobione na różne sposoby. Możesz przechowywać dane na sposoby podręcznikowe, czyli optymalizując tabele by pozbyć redundantnych danych. Możesz też spreparowac dane by wykorzystać je od razu przy wysyłce. Ale tutaj niemal na pewno wystąpi powtórzenie danych. Kwestia więc estetyki i miejsca na dysku czy w bazie ![]() id_transakcji, id_usera, transkcja. Czemu tak? Pierwsze pole nie wymaga wyjaśnień. Drugie przechowuje id_usera w systemie. Jeśli jest tam liczba, wiem że muszę podstawowych danych adresowych szukać w profilu usera o danym id. jeśli brak, user jest anonimowy i danych wysyłki szukam w polu transakcji. A co jeśli user ma inne dane w profilu, a na inne chce wysłać? Formularz transakcji i jedna z opcji to zmiana adresu wysyłki. Można dodatkowo dodać checkboxy, czy dane te mają stać się profilowymi, a może także domyślnymi dla dalszych wysyłek. Jak widzisz, jest dużo możliwości. Oczywiście wygodnie jest wtedy zapisac ów adres wysyłki także do transakcji. Sama transakcja to dla mnie właśnie zserializowane dane o całości zamówienia. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Czyli czy moja struktura tabel moze wygladac nastepująco?
User *ID *name *address Product *ID *name *desc *category *price Category *ID *name Order *ID *User_id *order *address *status Jeśli kupujący jest (zalogowany/ nie zalogowany), to wszystkie akcje związane z produktem zapisuję w sesji (Product_id, amount) (czy to bezpieczne??) Jeśli kupujący chce kupić produkt: *jest zalogowany, to wyświetlam podsumowanie, i w formularz wysyłki wstawiam jego adres z profilu (jeśli chce może go zmienić) *jeśli jest niezalogowany wyświetlam pusty formularz Jeśli zdecyduje się kupić do tabeli Order wrzucał userID/NULL, adres na który chce wysłać, wszystkie zserializowane obiekty, które kupił (gdzie umieścić informacje o ich liczebności), status (domyślnie rozpoczęta) Co jeśli będę chciał wyszukać jakie produkty kupili userzy?? Pobieranie całej zawartości Order->status, zamienianie na obiekt nie wydaje mi się najlepszą opcją... ======================= User *ID *name *address Product *ID *name *desc *category *price Category *ID *name Order *ID *User_id *item_ID *address Item *ID *product (serializowany) *amount Jaka opcja lepsza. Mnie wydaje się, że nr2.... Wyszukiwanie jacy userzy kupili dany produkt też w tym przypadku nie powinno być takie trudne (Wydaje mi się że jeśli produkt jest zserializowany, to można odczytać jego ID). Jedyna wada/zaleta każdy produkt można wysłać na inny adres Ten post edytował mimol 9.01.2013, 10:54:24 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Mi akurat odczytywanie co user dodał do koszyka nie było potrzebne. Jeśli Cię interesuje na zasadzie zrobienia opcji w stylu "Inni kupujący ten produkt kupili także...", to możesz po prostu "wypchnąć" określony i potrzebny parametr poza serializowane dane. W Twoim wypadku nieco inaczej bym podszedł do koszyka. Masz userów, produkty i kategorie w sumie bez zmian. Zastanawiałbym się jednak nad wywaleniem category z Product i połączeniem go relacją Many-to-Many go z Category.
Order może zawierać id, usera, adres, ale zawiera nie połączenie do produktu, ale utwórz tu kolekcję serializowanych danych, czyli relacja One-To-Many z Item. Z kolei Item to nie jest cały serializowany Product, ale jedynie wybrane jego składowe. Po co trzymać tam desc, który będzie niezwykle długi zapewne? ![]() User *ID *name *address Product *ID *name *desc *price Category *ID *name ProductCategory *productId *categoryId (klucz typu unique na oba razem) Order *ID *User_id *address OrderProduct *orderId (przynajmniej na tym index) *productId *product (serializowany) *amount Myslę, że najpierw musisz przemysleć cele i zachowanie użytkownika w systemie. Jak od jego strony powinien proces kupna przebiegać od początku do końca. Co w przypadku cofania się lub innych wariacji w systemie? Jak rozbic proces na składowe? Naprawdę... Zobacz, że gdyby nie Twoje wspomnienie o przeglądaniu produktów usera, to bym nigdy nie wpadł, ze struktura może być inna. Dostosuj bazę do funkcjonalnosci... Nie na odwrót. Inaczej zostaniesz z protezami, które nie wiadomo potem jak poprawiać. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Hmm z category nie chce kombinować (Jako przykład podałem uproszczony model), bo obecnie mam Kategorie, i Podkategorie i relacje między nimi.
Dzięki za pomoc. Pozostaje jeszcze jedna kwestia, o której wspomniałem. Zapomniałeś mi wyjaśnić czy od razu ładować wszystko do bazy (klient doda pierwszy produkt -> w bazie generuje się nowy Order i reszta tabel, przy dodawaniu następnych sprawdzane jest czy to jest pierwszy czy kolejny produkt), czy (chyba lepszy pomysł) dopiero na końcu składania zamówienia (po uzupełnieniu adresu, metody płatności) wrzucić to do bazy, a przed tym trzymać wszystko w Sesji... I tutaj jest problem bo wydaje mi się, że SF2 nie ma swojej obsługi sesji więc można ją łatwo odczytać/zatruć. Jak sobie poradzić z tym problemem? Ten post edytował mimol 9.01.2013, 13:18:18 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Ja bym dodał jeszcze
Product *ID *name *desc Product_Price *product_id *price *change_date wtedy na dany dzien będzie mozna cene wyciągnąć Cytat Zapomniałeś mi wyjaśnić czy od razu ładować wszystko do bazy (klient doda pierwszy produkt -> w bazie generuje się nowy Order i reszta tabel, przy dodawaniu następnych sprawdzane jest czy to jest pierwszy czy kolejny produkt), czy (chyba lepszy pomysł) dopiero na końcu składania zamówienia (po uzupełnieniu adresu, metody płatności) wrzucić to do bazy, a przed tym trzymać wszystko w Sesji... wkładaj odrazu do bazy a w sessji numer zamówienia trzymaj żebys kolejne produkty pod to samo zamówienie podpinał a status zamówienia zmieniaj (na potwierdzone) jak już Ci klient wpisze wszystkie dane i kliknie "Zamawiam|Potwierdzam" Ten post edytował skowron-line 9.01.2013, 13:31:51 -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
jak sobie poradzić z czyszczeniem wpisów które nie są dokończone? Używając CronJoba? czy jest jakiś sposób aby tworzyć 'tymczasowe' tabele?
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Bezpieczniej jest trzymać gdzieś w bazie taki tymczasowy koszyk, który potem będziesz tylko uzupełniał o kolejne produkty. Jeśli masz to zrobić jednak jak najprościej, to i sama sesja na koszyk starczy. Co do czyszczenia to najprościej użyć cronjobs lub eventów.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mógłbyś rozwinąć ideę eventów.
Znalazłem http://www.alexatnet.com/articles/programming-events-php Ale nie mam pojęcia jak teko używać/ kiedy wywołać jakiś event? |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 4 340 Pomógł: 542 Dołączył: 15.01.2006 Skąd: Olsztyn/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli chodzi o czyszczenie to dasz jakis czas na zatwierdzenie zamówienia a po tym czasie będziesz usuwał wpisy.
http://dev.mysql.com/doc/refman/5.1/en/events.html tu masz eventy w mysql. -------------------- I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy. QueryBuilder, Mootools.net, bbcradio1::MistaJam http://www.phpbench.com/ |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.08.2025 - 22:20 |