Koncepcja bazy danych dla projektu sklepu (koszyk)

0

Witam, tak się właśnie zastanawiam nad tym jak powinna wyglądać baza danych dla sklepu i myślę nad koncepcją dla koszyka dla konkretnego użytkownika w bazie. Mogę zrobić tabelę "koszyk", dać id_koszyka, nazwe_uzytkownika i dodać pozycję zakupy, gdzie jakimś znakiem specjalnym będę oddzielać id produktów, które użytkownik wstawił do koszyka, ale wydaje mi się, że nie jest to chyba jedno z lepszych rozwiązań? W Internecie znalazłem sporo propozycji, ale nikt nie zwraca uwagi dlaczego akurat wybiera dany schemat.

Byłbym wdzięczny za jakieś sugestie i zastrzeżenia.

1

Twój pomysł jest zdecydowanie zły.

Carts

Id
ClientId
Date

CartsPositions

Id
CartId
ProductId
Quantity
Price (cena jednostkowa)
Currency (jeśli ceny mogą być w różnej walucie)

masz relację 1:n między Carts:CartsPositions

0
massther napisał(a)

Twój pomysł jest zdecydowanie zły.

||=Carts
||Id
||ClientId
||Date

||=CartsPositions
||Id
||CartId
||ProductId
||Quantity
||Price (cena jednostkowa)
||Currency (jeśli ceny mogą być w różnej walucie)

masz relację 1:n między Carts:CartsPositions

A jak to powinienem wyświetlać? Bo trochę nie chwytam koncepcji. Dla jednego produktu, to wszystko jest jasne, wybiera jeden, wpisuje ilość resztę ja zapewniam, ale co jak wybierze więcej niż jeden produkt, jak mam to wyświetlić razem w jednym koszyku?

Może mógłbym prosić o przykład dla dwóch dowolnych produktów i dwóch dowolnych użytkowników? Mam nadzieję, że to pozwoli mi zrozumieć schemat.

1

yyyy, w tabeli? o_O
Zacznijmy od tego że select z jednej tabeli z where to sobie możesz używać na pierwszej godzinie ćwiczeń z sql. Dane z bazach nazywanych relacyjnymi są ze sobą w (ciekawostka) relacjach.
Tu jest przypadek kiedy mamy byt nadrzędny, którym jest koszyk oraz byty podrzędne, czyli pozycje w tym koszyku. Inaczej koszyk agreguje w sobie kupowane produkty.
Więc dla konkretnego klienta i wiadomego koszyka pobierasz dane z CartsPositions (pewnie trzeba złączyć z produktami, żeby poznać nazwy produktów).
Dostaniesz coś takiego:

Id =CartId =ProductId =Quantity =Price =ProductName =inne kolumny z tabeli z produktami
1 1 1 2 100.00 Piłka
2 1 2 1 35.50 Pompka
3 1 6 1 420.00 Stół
4 1 8 6 79.99 Krzesło
Jak to w aplikacji wyświetlisz, to ja już nie wiem, ale logicznie będzie w tabeli.
0
massther napisał(a)

yyyy, w tabeli? o_O
Zacznijmy od tego że select z jednej tabeli z where to sobie możesz używać na pierwszej godzinie ćwiczeń z sql. Dane z bazach nazywanych relacyjnymi są ze sobą w (ciekawostka) relacjach.
Tu jest przypadek kiedy mamy byt nadrzędny, którym jest koszyk oraz byty podrzędne, czyli pozycje w tym koszyku. Inaczej koszyk agreguje w sobie kupowane produkty.
Więc dla konkretnego klienta i wiadomego koszyka pobierasz dane z CartsPositions (pewnie trzeba złączyć z produktami, żeby poznać nazwy produktów).
Dostaniesz coś takiego:
||=Id||=CartId||=ProductId||=Quantity||=Price||=ProductName||=inne kolumny z tabeli z produktami
||1||1||1||2||100.00||Piłka
||2||1||2||1||35.50||Pompka
||3||1||6||1||420.00||Stół
||4||1||8||6||79.99||Krzesło
Jak to w aplikacji wyświetlisz, to ja już nie wiem, ale logicznie będzie w tabeli.

No teraz jest to dla mnie bardziej zrozumiałe, tylko jedno pytanie, jeśli nie mam używać select z where dla CartId to jakie mam zadać zapytanie, żeby klient widział w koszyku swoje pozycje? I też pytanie, skoro działałoby to na select z where dla jednej tabeli, to po co utrudniać sobie życie? Pytam poważnie, bo z bazami danych nie mam wiele wspólnego a zawsze ciekawiło mnie jaki jest sens robienia czegoś w sposób trudny, skoro tym łatwym dało się wszystko załatwić?

0

Sposób trudny to wpychanie po jednego pola tekstowego wielu dany z jakimś wymyślonym separatorem. Po to są relacje w bazach relacyjnych żeby dane powiązać ze sobą.
Bo wybraniu wartości tego pola musisz splitować i parsować zawarte tam dane, po stronie bazy to często wyjątkowo trudne.
Z tym "select" chodziło mi o to, że myślenie że zawsze wszystko da się za pomocą select z jednej tabeli wyświetlić jest błędne. Po to mamy dane, które są ze sobą w relacji, aby można je było przez te relacje wiązać.
W tym przypadku jeśli dla jednego klienta będzie więcej koszyków zapamiętanych (np. dla różnych dni, czy jakiekolwiek inne kryteria), to najpierw musisz wybrać id koszyka, który chcesz pokazać a później na na podstawie tego id wybrać pozycje w koszyku. Ale przez odpowiednie złączenie, czy podzapytanie da się to uzyskać w jednym kroku (jednym zapytaniu), nie trzeba osobno połączyć się i pobrać id koszyka, a później pozycji koszyka.

0

Dzięki za wszystkie odpowiedzi, wezmę sobie Twoje słowa do serca ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1