Projekt logiczny

1. Projekt tabel

Wraz z postępem prac w bazie pojawiło się kilka poprawek, głównie związanych z sprecyzowaniem działania poszczególnych fragmentów systemu. Aktualny diagram naszej bazy znajduje się poniżej.

Diagram bazy danych

Jak widać oprócz kilku zmian w parametrach doszło także kilka nowych tabel np LogEntry czy Persmision. Są one odpowiedzialne za autentykacje użytkowników – generowane automatycznie przez Django. Tabele Session, Site i MigrationHistory także są tworzone przez framework Djano i obsługują połączenie klienta z naszym portalrem. Główna struktura tabel podana na ERD jest niezmieniona. Poniżej kod SQL generujący bazę. W naszym przypadku jest to SQLite.

Kod SQL generujący bazę

2. Słownik danych

  1. auth_user - główne informacje o użytkowniku systemu
    • id - integer NOT NULL PRIMARY KEY,
    • username - varchar(100) NOT NULL, nick użytkownika
    • first_name - varchar(100), imię
    • last_name - varchar(100), nazwisko
    • email - varchar(100), adres e-mail
    • password - varchar(100) NOT NULL, haslo w postaci zahashowanej
    • is_staff - bool NOT NULL, informacja czy użytkownik to pracownik restauracji
    • is_active - bool NOT NULL, informacja o aktywności konta
    • is_superuser - bool NOT NULL, informacja czy użytkownik to administrator
    • last_login - date NOT NULL, data ostatniego logowania
    • date_joined - date NOT NULL data utworzenia konta
    • groups - pole ManyToMany automatycznie generowane, przypisanie użytkownika do grupy
    • user_permisions - pole ManyToMany automatycznie generowane, nadawanie praw i ról użytkownikowi
  2. accounts_contactdata - tabela przechowująca dane adresowe
    • id - integer NOT NULL PRIMARY KEY,
    • city - varchar(100), miasto
    • street - varchar(100), ulica
    • flat_number - varchar(10), nr mieszkania
    • pna - varchar(6),
    • phone - varchar(12), nr telefonu
  3. accounts_userprofile - informacje o profilu użytkownika
    • id - integer NOT NULL PRIMARY KEY
    • user_id - integer NOT NULL UNIQUE, referencja do tabeli auth_user
    • contact_data_id - integer NOT NULL, referencja do tabeli accounts_contactdata
    • activation_key - varchar(40) NOT NULL
  4. accounts_comment - komentarze użytkowników
    • id - integer NOT NULL PRIMARY KEY,
    • user_comment - text NOT NULL, treść komentarza
    • ratio - integer unsigned NOT NULL, ocena w skali 1-10
    • user_id - integer NOT NULL, referencja do tabeli accounts_userprofile
    • restaurant_id - integer NOT NULL, referencja do tabeli restaurants_restaurant
    • dish_id - integer NOT NULL, referencja do tabeli restaurants_dish
  5. accounts_basket - tabela przechowująca aktywne koszyki zleceń
    • id - integer NOT NULL PRIMARY KEY,
    • user_id - integer, referencja do tabeli accounts_userprofile
    • session - varchar(32), numer aktywnej sesji w przeglądarce
  6. restaurants_restaurant - informacje o restauracji
    • id - integer NOT NULL PRIMARY KEY,
    • user_id - integer NOT NULL UNIQUE, referencja do tabeli auth_user
    • is_promo - bool NOT NULL, atrybut pomocyjny
    • activation_key - varchar(40) NOT NULL, klucz aktywacyjny restaurację
    • contact_data_id - integer NOT NULL UNIQUE, referencja do tabeli accounts_contactdata
    • description_id - integer NOT NULL UNIQUE, id opisu restauracji
  7. restaurants_dish - tabela przechowująca informacje o potrawach
    • id - integer NOT NULL PRIMARY KEY,
    • name - varchar(100) NOT NULL, nazwa potrawy
    • description - varchar(500) NOT NULL, opis potrawy
    • price - varchar(7) NOT NULL, cena
    • category_id - integer NOT NULL, id kategorii
    • restaurant_id - integer NOT NULL, referencja do tabeli restaurants_restaurant
  8. restaurants_category - kategorie potraw
    • id - integer NOT NULL PRIMARY KEY,
    • name - varchar(200) NOT NULL, nazwa kategorii
  9. restaurants_description - informacje o restauracjach
    • id - integer NOT NULL PRIMARY KEY,
    • name - varchar(200) NOT NULL, nazwa restauracji
    • description - text, opis tekstowy o restauracji
    • img - varchar(100) NOT NULL, zdjęcie restauracji
  10. restaurants_orderingdish - tabela z zamawianymi potrawami
    • id - integer NOT NULL PRIMARY KEY,
    • count - integer unsigned NOT NULL, liczebność zamówienia
    • dish_id - integer NOT NULL, referencja do tabeli restaurants_dish
    • basket_id - integer, referencja do tabeli accounts_basket
    • order_id - integer, id zamowienia
  11. restaurants_order - tabela z zamówieniami
    • id - integer NOT NULL PRIMARY KEY,
    • state - varchar(1) NOT NULL, obecny stan zamówienia
    • order_date - date NOT NULL, data zamówienia
    • contact_data_id - integer NOT NULL, referencja do tabeli accounts_contactdata

3. Analiza zależności funkcyjnych

W tym punkcie należy sprawdzić czy nasza baza jest w trzeciej postaci normalnej (3NF). Pierwszym krokiem jest sprawdzenie drugiej postaci normalnej (2NF) a następnie czy wszystkie atrybuty niekluczowe są zależne tylko od parametrów kluczowych.

Sprawdzenie 2NF

Specyfika pracy z Django sprawia, że uzyskane tabele składają się tylko z kluczy prostych, z tego powodu baza napewno jest w drugiej postaci normalnej.

Sprawdzenie zależności pomiędzy atrybutami niekluczowymi
  • auth_user - informacje o użytkowniku systemu
    • id - PRIMARY KEY,
    • username
    • first_name
    • last_name
    • email
    • password
    • is_staff
    • is_active
    • is_superuser
    • last_login
    • date_joined
    • groups
    • user_permisions

Wszystkie pola są zależne od klucza głównego i nie mogą bez tego istnieć.

  • accounts_contactdata - dane adresowe
    • id PRIMARY KEY,
    • city
    • street
    • flat_number
    • pna
    • phone

Wszystkie pola zależne od klucza głównego

  • accounts_userprofile - informacje o profilu użytkownika
    • id PRIMARY KEY
    • user_id FOREIGN KEY
    • contact_data_id FOREIGN KEY
    • activation_key - Prametr zależny od klucza głównego.
  • accounts_comment - komentarze użytkowników
    • id - PRIMARY KEY,
    • user_comment
    • ratio
    • user_id - FOREIGN KEY
    • restaurant_id - FOREIGN KEY
    • dish_id - FOREIGN KEY

Parametry niekluczowe (user_comment, ratio) zależne od klucza głównego.

  • accounts_basket - koszyki zleceń
    • id - PRIMARY KEY,
    • user_id - FOREIGN KEY
    • session - zależny od aktywnego koszyka (klucza głównego)
  • restaurants_restaurant - informacje o restauracji
    • id - PRIMARY KEY,
    • user_id - FOREIGN KEY
    • is_promo
    • activation_key
    • contact_data_id - FOREIGN KEY
    • description_id - FOREIGN KEY

Atrybuty is_promo oraz activation_key są zależne od klucza głównego restauracji

  • restaurants_dish - informacje o potrawach
    • id - PRIMARY KEY,
    • name
    • description
    • price
    • category_id - FOREIGN KEY
    • restaurant_id - FOREIGN KEY

Ponownie wszystkie atrybuty niekluczowe są zależne tylko od klucza głównego

  • restaurants_category - kategorie potraw
    • id - PRIMARY KEY,
    • name - zależne od klucza
  • restaurants_description - informacje o restauracjach
    • id - PRIMARY KEY,
    • name
    • description
    • img

Wszystkie atrybuty zależne od klucza

  • restaurants_orderingdish - tabela z zamawianymi potrawami
    • id - PRIMARY KEY,
    • count - liczebnośc zamówienia, zależna od zamówionej potrawy (klucza głównego)
    • dish_id - FOREIGN KEY
    • basket_id - FOREIGN KEY
    • order_id - FOREIGN KEY
  • restaurants_order - tabela z zamówieniami
    • id - PRIMARY KEY,
    • state
    • order_date
    • contact_data_id - FOREIGN KEY

Oba atrybuty state oraz order_date są specyficzne dla zamówienia, dlatego są zależne od klucza.

Wynik

Na postawie tej analizy wynika, że są spełnione oba założenia zatem możemy stwierdzić, że nasza bazie jest w trzeciej postaci normalnej (3NF).

4. Operacje na danych

Pobranie listy restauracji
SELECT "restaurants_restaurant"."id", "restaurants_restaurant"."user_id", "restaurants_restaurant"."is_promo", "restaurants_restaurant"."activation_key", "restaurants_restaurant"."contact_data_id", "restaurants_restaurant"."description_id" FROM "restaurants_restaurant"
Rejestracja użytkownika
  • User
NSERT INTO "auth_user" ("username", "first_name", "last_name", "email", "password", "is_staff", "is_active", "is_superuser", "last_login", "date_joined") VALUES (restauracja, , , restauracja@gmail.com, sha1$2cde6$02b068ba3bf0bdb0b40878d357c879bd4c716c47, False, True, False, 2011-06-16 02:00:20.516032, 2011-06-16 02:00:20.516032)
  • ContactData
INSERT INTO "accounts_contactdata" ("city", "street", "flat_number", "pna", "phone", "lat", "lng") VALUES (city, street, flat_number, zip, phone_number, None, None)
  • UserProfile
INSERT INTO "accounts_userprofile" ("user_id", "contact_data_id", "activation_key") VALUES (2, 1, a1d96ad94e96abc3247c41c888fbf7bc4c7a9770)
Rejestracja restauracji
  • User
INSERT INTO "auth_user" ("username", "first_name", "last_name", "email", "password", "is_staff", "is_active", "is_superuser", "last_login", "date_joined") VALUES (user, , , user@gmail.com, sha1$d3c29$db8cca0d71b4a26d5a2a5ee01db6f13a3161f090, False, True, False, 2011-06-16 01:51:41.714921, 2011-06-16 01:51:41.714921)
  • ContactData
INSERT INTO "accounts_contactdata" ("city", "street", "flat_number", "pna", "phone", "lat", "lng") VALUES (krakow, lea, 5, zip, tel, 50.0694749, 19.9237717)
  • Description
INSERT INTO "restaurants_description" ("name", "description", "img") VALUES (Nazwa, Opis, )
  • Restaurant
INSERT INTO "restaurants_restaurant" ("user_id", "is_promo", "activation_key", "contact_data_id", "description_id") VALUES (4, False, 1e7628f58f2ef403653e42fbd9ed2a4891fa5907, 2, 2)
  • Category
INSERT INTO "restaurants_category" ("name", "restaurant_id") VALUES (Dania z kurczaka, 1)
INSERT INTO "restaurants_category" ("name", "restaurant_id") VALUES (Dania z wieprzowiny, 1)
INSERT INTO "restaurants_category" ("name", "restaurant_id") VALUES (Napoje, 1)
Logowanie
SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."username" = restauracja
SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE ("django_session"."session_key" = 897afbf7b884bf9afd90aaaa214f321f AND "django_session"."expire_date" > 2011-06-16 02:06:12.307045 )
SELECT "django_session"."session_key", "django_session"."session_data", "django_session"."expire_date" FROM "django_session" WHERE "django_session"."session_key" = 35d4742a49267bfae806fd8f55b210bf
INSERT INTO "django_session" ("session_key", "session_data", "expire_date") VALUES (35d4742a49267bfae806fd8f55b210bf, ZjEwOTM1YzhhMjFhNzVmNWY3ZjlmNzViNTIyNGRlY2JmNzk0ZmE0YTqAAn1xAS4= , 2011-06-30 02:06:12.341886)
Dodawanie potrawy do menu restauracji
SELECT "restaurants_restaurant"."id", "restaurants_restaurant"."user_id", "restaurants_restaurant"."is_promo", "restaurants_restaurant"."activation_key", "restaurants_restaurant"."contact_data_id", "restaurants_restaurant"."description_id" FROM "restaurants_restaurant" WHERE "restaurants_restaurant"."user_id" = 4
SELECT "restaurants_category"."id", "restaurants_category"."name", "restaurants_category"."restaurant_id" FROM "restaurants_category" WHERE "restaurants_category"."name" = Dania z kurczaka
INSERT INTO "restaurants_dish" ("name", "description", "price", "category_id", "restaurant_id") VALUES (Kurczak na ostro, kurczak w ostrym sosie, ryż, surówka, 22, 1, 1)
Pobieranie menu restauracji
SELECT "restaurants_dish"."id", "restaurants_dish"."name", "restaurants_dish"."description", "restaurants_dish"."price", "restaurants_dish"."category_id", "restaurants_dish"."restaurant_id" FROM "restaurants_dish" WHERE "restaurants_dish"."restaurant_id" = 1
Pobieranie komentarzy o restauracji
SELECT "accounts_comment"."id", "accounts_comment"."user_comment", "accounts_comment"."ratio", "accounts_comment"."user_id", "accounts_comment"."restaurant_id", "accounts_comment"."dish_id" FROM "accounts_comment" WHERE "accounts_comment"."restaurant_id" = 1
Pobieranie komentarzy o potrawie
SELECT "accounts_comment"."id", "accounts_comment"."user_comment", "accounts_comment"."ratio", "accounts_comment"."user_id", "accounts_comment"."restaurant_id", "accounts_comment"."dish_id" FROM "accounts_comment" WHERE "accounts_comment"."dish_id" = 1
Pobieranie koszyka niezalogowanego użytkownika
SELECT "accounts_basket"."id", "accounts_basket"."user_id", "accounts_basket"."session" FROM "accounts_basket" WHERE "accounts_basket"."session" = b015e7e807f1d0474a870df8cafe570b
Dodawanie potrawy do koszyka oraz do zamówień restauracji
SELECT "accounts_basket"."id", "accounts_basket"."user_id", "accounts_basket"."session" FROM "accounts_basket" WHERE "accounts_basket"."session" = e8974ec8edc1b95284a6bc351f949f3b
INSERT INTO "accounts_basket" ("user_id", "session") VALUES (None, e8974ec8edc1b95284a6bc351f949f3b)
INSERT INTO "restaurants_orderingdish" ("count", "dish_id", "basket_id", "order_id") VALUES (1, 3, 1, None)
Zamawianie potrawy
SELECT "accounts_basket"."id", "accounts_basket"."user_id", "accounts_basket"."session" FROM "accounts_basket" WHERE "accounts_basket"."session" = e8974ec8edc1b95284a6bc351f949f3b
INSERT INTO "accounts_contactdata" ("city", "street", "flat_number", "pna", "phone", "lat", "lng") VALUES (Krakow, Lea, 100/5, 32-300, 600600600, None, None)
INSERT INTO "restaurants_order" ("state", "order_date", "contact_data_id", "restaurant_id") VALUES (0, 2011-06-16, 3, 1)
SELECT "restaurants_orderingdish"."id", "restaurants_orderingdish"."count", "restaurants_orderingdish"."dish_id", "restaurants_orderingdish"."basket_id", "restaurants_orderingdish"."order_id" FROM "restaurants_orderingdish" WHERE "restaurants_orderingdish"."basket_id" = 1
UPDATE "restaurants_orderingdish" SET "count" = 1, "dish_id" = 3, "basket_id" = NULL, "order_id" = 1 WHERE "restaurants_orderingdish"."id" = 1
Dodawania komentarza o restauracji i potrawie
INSERT INTO "accounts_comment" ("user_comment", "ratio", "user_id", "restaurant_id", "dish_id") VALUES (Dobry, 5, None, None, 3)
INSERT INTO "accounts_comment" ("user_comment", "ratio", "user_id", "restaurant_id", "dish_id") VALUES (Super, 6, None, 1, None)
Przyjęcie zamówienia do realizacji
SELECT "restaurants_restaurant"."id", "restaurants_restaurant"."user_id", "restaurants_restaurant"."is_promo", "restaurants_restaurant"."activation_key", "restaurants_restaurant"."contact_data_id", "restaurants_restaurant"."description_id" FROM "restaurants_restaurant" WHERE "restaurants_restaurant"."user_id" = 4
SELECT "restaurants_order"."id", "restaurants_order"."state", "restaurants_order"."order_date", "restaurants_order"."contact_data_id", "restaurants_order"."restaurant_id" FROM "restaurants_order" WHERE "restaurants_order"."id" = 1
UPDATE "restaurants_order" SET "state" = 1, "order_date" = 2011-06-16, "contact_data_id" = 3, "restaurant_id" = 1 WHERE "restaurants_order"."id" = 1
pl/dydaktyka/ztb/2011/projekty/restauracje/logiczny/index.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0