Dobrym ćwiczeniem z modelowania danych dla początkujących jest utworzenie modelu danych sklepu internetowego . Za każdym razem, gdy daję to ćwiczenie moim uczniom, jestem zaskoczony, jak trudne jest dla nich.
Znajdź koncepcje...
Zobaczmy, jak można to zrobić. Wiemy, że musimy stworzyć tabelę dla każdej koncepcji w domenie. Pomyśl o rzeczownikach i wyrażenia rzeczownikowe użyłbyś do opisania domeny. Z grubsza każdy rzeczownik jest albo pojęciem, atrybutem pojęcia, albo przykładem . Jakie są podstawowe koncepcje w sklepie internetowym? Od razu przychodzą na myśl dwa słowa:
- klienci – osoby, które kupują rzeczy w naszym sklepie, oraz
- produkty – przedmioty, które ludzie kupują w naszym sklepie.
Każdy klient ma podstawowy zestaw danych, które go opisują:id (zwykle potrzebujesz atrybutu id w swojej tabeli), imię i nazwisko, adres e-mail i hasło. Podobnie produkt ma identyfikator i nazwę. Moglibyśmy dodać więcej atrybutów dla klientów i produktów, ale na potrzeby tego przykładu to wystarczy. Do naszego modelu dodajemy dwie tabele.
... a także pojęcia abstrakcyjne
To jest sklep, więc oczywiście chcemy wiedzieć co został zamówiony i przez kogo . „Zamówienie” to słowo kluczowe w większości baz danych, więc nie powinniśmy używać go jako nazwy tabeli. Zamiast tego użyjemy nazwy purchase
dla trzeciego stołu w naszym modelu. Tabela musi być w jakiś sposób połączona z customer
i do product
. Na początek narysujmy odniesienie między purchase
i customer
i między purchase
i product
.
customer-purchase
odniesienie jest OK. Każdy zakup dokonywany jest przez jednego klienta; każdy klient może dokonać kilku zakupów. To odniesienie zostanie tutaj na stałe.
Jednak coś jest nie tak z purchase-product
odniesienie. Kilka produktów można kupić w jednym zakupie; kilka zakupów może obejmować ten sam produkt. Ale nasze referencje pozwalają na zakup tylko jednego produktu podczas jednego zakupu. Usuńmy odniesienie i zastanówmy się nad innym sposobem jego modelowania.
Jedno duże pole tekstowe dla wszystkich zakupionych produktów?
A może dodamy duże pole tekstowe, w którym można przechowywać nazwy lub identyfikatory zakupionych produktów? Teraz możemy kupić kilka produktów w jednym zakupie. Jednak są tutaj pewne problemy:
- Po pierwsze, trudno jest sprawdzić, czy produkt w
purchased_items
pole jest naprawdę w bazie danych. - Po drugie, jeśli chcesz zmienić nazwę produktu (ponieważ ją błędnie napisałeś), musisz zaktualizować wszystkie
purchased_items
instancje pól wpurchase
stół. - Wreszcie trudno jest analizować dane w bazie danych. Na przykład, jeśli chcesz dowiedzieć się, który produkt jest kupowany najczęściej, musisz użyć operacji na podciągu tekstu. A to nigdy nie jest zbyt wydajne.
Kilka kolumn produktów w tabeli zakupów?
Jakie są inne opcje? Chcemy, aby zakup był powiązany z kilkoma produktami, więc może powinniśmy dodać kilka purchase_item
kolumny w tabeli zakupów? Cóż, to jest męczące (dodałem tylko 5 kolumn i zmęczyłem się) i tworzy sztuczne i głupie ograniczenie liczby kupowanych produktów.
Użyj tabeli pośredniej!
Głupie rozwiązanie podpowiada właściwe rozwiązanie. Chcemy mieć nieograniczoną ilość produktów związanych z zakupem. Jedynym sposobem jest posiadanie pośredniej tabeli łączącej . Nazwijmy to purchase_item
. purchase_item
tabela jest połączona z purchase
i product
. Teraz zakup może obejmować tyle produktów, ile chcemy. Jako bonus możemy dodać dodatkowe dane w tabeli:liczba zakupów, łączna cena za ten przedmiot i tak dalej.
Wnioski:
- Tabele w modelu mogą reprezentować nie tylko obiekty fizyczne jak klient lub produkt. Tabele mogą przedstawiać więcej abstrakcyjnych pojęć jak zakup. Innymi przykładami mogą być rezerwacja w systemie rezerwacji hotelowych, book_loan w modelu dla biblioteki, wizyta w systemie dla lekarzy itp.
- Gdy modelujesz transakcję (tj. kupowanie lub sprzedawanie wielu rzeczy), zwykle potrzebujesz trzech tabel :jeden dla transakcji (zakupu lub rezerwacji w systemie rezerwacji hotelowej), jeden dla rzeczy kupionych/sprzedawanych w ramach transakcji (produkt, pokój hotelowy) i jeden dla pozycji transakcyjnych (purchase_item, booking_item). W razie potrzeby możesz dodać dodatkowe informacje w tabeli pośredniej.
Stwórz własny model bazy danych sklepu za pomocą Vertabelo!